diff --git a/karaf/.gitignore b/karaf/.gitignore
deleted file mode 100644
index 7771151..0000000
--- a/karaf/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-*.iml
-*.ipr
-*.iws
-.project
-.classpath
-.settings
-target
diff --git a/karaf/BUILDING b/karaf/BUILDING
deleted file mode 100644
index 533852a..0000000
--- a/karaf/BUILDING
+++ /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.
- */
-
-Building Apache Felix Karaf
-===================================
-
-Initial Setup
--------------
-
-1) Install J2SE 5.0 SDK, which can be downloaded from 
-   http://java.sun.com/j2se/1.5.0/download.jsp. Use version of 1.5.0_06 JDK.
-
-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, 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 Felix Karaf source distribution.
-2) Run
-         $> mvn
-   This will compile Apache Felix Karaf and run all of the tests in the
-   Apache Felix Karaf source distribution. Alternatively, you can run
-         $> mvn -Pfastinstall
-   This will compile Apache Felix 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/LICENSE b/karaf/LICENSE
deleted file mode 100644
index 6b0b127..0000000
--- a/karaf/LICENSE
+++ /dev/null
@@ -1,203 +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.
-
diff --git a/karaf/NOTICE b/karaf/NOTICE
deleted file mode 100644
index ddb6c19..0000000
--- a/karaf/NOTICE
+++ /dev/null
@@ -1,44 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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
-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/README b/karaf/README
deleted file mode 100644
index bc6a670..0000000
--- a/karaf/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 Felix Karaf
-====================================
-Apache Felix 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 Felix Karaf source distribution, please read
-BUILDING for instructions on building Apache Felix Karaf.
-
-For an Apache Felix 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://felix.apache.org/site/apache-felix-karaf.html
-
-If you need more help try talking to us on our mailing lists
-    http://felix.apache.org/site/mailinglists.html
-
-If you find any issues with Apache Felix Karaf, please submit reports
-with JIRA here:
-    http://issues.apache.org/jira/browse/FELIX
-
-We welcome contributions, and encourage you to get involved in the 
-Felix community. If you'd like to learn more about how you can
-contribute, please see:
-    http://felix.apache.org/site/contributing.html
-
-Many thanks for using Apache Felix Karaf.
-
-
-The Felix Team
-
diff --git a/karaf/RELEASE-NOTES b/karaf/RELEASE-NOTES
deleted file mode 100644
index c171666..0000000
--- a/karaf/RELEASE-NOTES
+++ /dev/null
@@ -1,605 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 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 protocol: org.apache.servicemix.kernel.gshell
-     * [SMX4KNL-172] - the new command optional/cat from gshell can't support mvn/http protocol
-     * [SMX4KNL-174] - NoClassDefFoundError jline/ConsoleReader when invoking servicemix-client
-     * [SMX4KNL-176] - 'features/install xxx' tries to install version 0.0.0 instead of the latest one
-     * [SMX4KNL-177] - Some of the Optional commands have moved to different packages in the latest snapshot of geronimo gshell
-     * [SMX4KNL-178] - Remove debug log statements when booting
-     * [SMX4KNL-180] - features/install xxx barfs when using non osgi compliant versions
-     * [SMX4KNL-181] - osgi/install -s throws a NPE if the bundle can not be resolved
-     * [SMX4KNL-182] - Upon restart, the list of previously  installed features is not available anymore
-     * [SMX4KNL-185] - Features JMX view does not reload persistent state on restart
-     * [SMX4KNL-187] - Features JMX view making too much log noise
-     * [SMX4KNL-188] - Gshell itests fail on windows
-     * [SMX4KNL-190] - Deployment / Startup of spring xml configurations doesn't work correctly
-     * [SMX4KNL-192] - ServiceMix Kernel startup blocks
-     * [SMX4KNL-198] - The console / server / client arguments to servicemix shell script are broken
-     * [SMX4KNL-199] - Missing resource bundle for obr shell
-     * [SMX4KNL-201] - The client jar does not exit when running with --help argument
-     * [SMX4KNL-202] - Startup of a pending to deploy Spring config file fails when all required bundles got installed
-     * [SMX4KNL-204] - OsgiConfiguration.unregister() throw NPE when exit smx
-     * [SMX4KNL-205] - "ld | grep WARN" does not filter while "log/display | grep WARN" does
-     * [SMX4KNL-207] - features/install should install latest feature version for any dependency that does not explicitly specify a dependency
-     * [SMX4KNL-208] - Bundle#loadClass sometimes return null instead of throwing a CNFE
-     * [SMX4KNL-212] - Exceptions are displayed in the console when trying to load default xml catalogs
-     * [SMX4KNL-215] - Don't attempt to stop fragments in filemonitor
-     * [SMX4KNL-218] - Can't find bundle for base name org.apache.servicemix.kernel.gshell.wrapper.InstallCommand, locale fr_BE
-     * [SMX4KNL-220] - The org.apache.servicemix.kernel.management bundle should not use DynamicImport-Package=*
-
- ** Improvement
-     * [SMX4KNL-36] - Investigate having a different bootstrap mechanism for a remote client to not start all the bundles installed (maybe by not using osgi)
-     * [SMX4KNL-62] - Enhance admin shell create command to allocate unique ports to new instances.
-     * [SMX4KNL-74] - When using the spring deployer, allow the customization of the OSGi manifest entries
-     * [SMX4KNL-78] - Small refactoring of the Feature interface
-     * [SMX4KNL-85] - Extend Shell#waitForFrameworkToStart to wait 60 seconds instead of 5 seconds.
-     * [SMX4KNL-101] - Reduce the amount of logging issued by mina
-     * [SMX4KNL-106] - Support for container level lock to support master/slave deployments
-     * [SMX4KNL-114] - prompt should print username@instance-name when using remote shell
-     * [SMX4KNL-119] - Use boot delegation instead of listing sun packages for jaxp / url handlers
-     * [SMX4KNL-120] - The ServiceMix Kernel testing platform should use the servicemix kernel main jar instead of the felix one
-     * [SMX4KNL-121] - Improve the Main class to easily embed the whole ServiceMix Kernel distribution in another web application
-     * [SMX4KNL-125] - Show command environment in kernel shell
-     * [SMX4KNL-127] - Add the update command in the osgi shell
-     * [SMX4KNL-130] - Support configurable lock directory for container level locking (for master/slave deployments).
-     * [SMX4KNL-136] - Upgrade to pax logging 1.2.0
-     * [SMX4KNL-154] - some Action moved from to another package cause kernel start up failed
-     * [SMX4KNL-158] - Move jline into its own bundle instead of using a private package in gshell-core
-     * [SMX4KNL-169] - Use the start level to implement the container level locking
-     * [SMX4KNL-184] - Align the commands name with the gshell ones
-     * [SMX4KNL-186] - features/uninstall should select the right version if only one version has been installed
-     * [SMX4KNL-191] - Upgrade to pax-logging 1.3.0
-     * [SMX4KNL-203] - When installing a feature, the service should first install all bundles, then start them all in order
-     * [SMX4KNL-206] - Felix version in servicemix-kernel-1.1.0-snapshot doesn't seem to support fragment bundles.
-     * [SMX4KNL-216] - Display fragments informations in the osgi list command
-     * [SMX4KNL-230] - Log statements using java.util.logging are logged into both stderr and data/log/servicemix.log file
-
- ** New Feature
-     * [SMX4KNL-28] - Create a config command to administer the ConfigAdmin service
-     * [SMX4KNL-33] - Enhance admin shell to provide commands to start / stop / list / connect to known ServiceMix instances
-     * [SMX4KNL-60] - Versionning of features
-     * [SMX4KNL-76] - support to install/uninstall different version of features
-     * [SMX4KNL-90] - Create new commands to leverage the PackageAdmin OSGi service
-     * [SMX4KNL-94] - Provide a JMX frontend on top of the features service
-     * [SMX4KNL-107] - Create a new "admin connect" command to easily connect to a named instance of servicemix
-     * [SMX4KNL-108] - Add a new 'log de' command that displays the last exception from the log
-     * [SMX4KNL-109] - Include the pax wrapper url handler in the kernel for ease of use of non osgi third party dependencies
-     * [SMX4KNL-111] - Add a "starting" state to the admin list command
-     * [SMX4KNL-113] - Upgrade to Felix 1.2.1
-     * [SMX4KNL-116] - Allow repository descriptors to reference other repository descriptors
-     * [SMX4KNL-131] - Include JAXP 1.4 API
-     * [SMX4KNL-143] - Provide a way to make BouncyCastle work in ServiceMix Kernel
-     * [SMX4KNL-144] - Use SSH as a remoting protocol to connect to a servicemix kernel
-     * [SMX4KNL-147] - Upgrade to spring-DM 1.2.0-m2
-     * [SMX4KNL-152] - The version number displayed in the console should be extract from resources (using maven filtering + properties file) but the branding should be easy to change so that people embedding the Kernel can define their own
-     * [SMX4KNL-156] - Move core management feature to the kernel
-     * [SMX4KNL-157] - Add a JAAS realm for authenticating users from SSH and JMX
-     * [SMX4KNL-163] - Provide default jdbc lock impl for master/slave deployments
-     * [SMX4KNL-167] - Upgrade to spring 2.5.6
-     * [SMX4KNL-171] - Include RFC0139 (JMX management of OSGi)
-     * [SMX4KNL-179] - Upgrade to felix 1.5.0-SNAPSHOT
-     * [SMX4KNL-214] - Hot deployment of features through the deploy folder
-
- ** Task
-     * [SMX4KNL-43] - Upgrade to latest gshell
-     * [SMX4KNL-93] - Extract the admin commands in their own module
-     * [SMX4KNL-98] - Use dependency management section for all dependencies
-     * [SMX4KNL-99] - Remove ant from the kernel distribution and replace its use in the filemonitor
-     * [SMX4KNL-129] - Make sure aliases and links commands work with the new gshell integration
-     * [SMX4KNL-166] - Move the embedded smx demo into trunk
-     * [SMX4KNL-168] - Downgrade to junit 3.8
-     * [SMX4KNL-196] - gshell-core source jar should use the shade plugin to include the gshell sources
-     * [SMX4KNL-197] - The client source jar should include the slf4j sources using the shade plugin
-     * [SMX4KNL-211] - Remove one of jmock or easymock from the kernel
-
-
-
-
-                    Apache ServiceMix Kernel 1.0.0
-                    ==============================
-
-  Overview
-  --------
-
- This release is the first GA release of ServiceMix Kernel.  A few bugs and enhancements have been done 
- to the Kernel since the second release candidate. The most two important fixes from a user point of view
- are SMX4KNL-70 which makes sure the bundles provided in the distribution are used first instead of the ones
- from the user's local maven repository and SMx4KNL-77 which allows artifacts in the /deploy folder to be 
- started when the needed dependencies have been installed successfully (the previous behavior was to fail
- if there were missing bundles when the artifact is processed).
- See the change log below for more informations.
-
-  Changelog
-  ---------
-
-  The following list shows the bug fixes and enhancements included in this release:
-
- ** Bug
-     * [SMX4KNL-70] - Bundles in /system folder should take precedence over local Maven repository
-     * [SMX4KNL-79] - When starting the kernel, a log entry states "Can not install feature ''"
-     * [SMX4KNL-80] - "features list" output has a "version" column but no infos
-     * [SMX4KNL-81] - The wrapper feature can not be installed out of the box
-     * [SMX4KNL-82] - The installation state of a feature is not displayed correctly after a restart when using the "features list" command
-     * [SMX4KNL-83] - When using the wrapper command, ServiceMix Kernel does not start correctly
-
- ** Improvement
-     * [SMX4KNL-69] - Add installation status for the 'features list' result.
-     * [SMX4KNL-71] - Export the gshell CommandExecutor in the OSGi registry
-     * [SMX4KNL-73] - Require work around for blocking in.read() call in ProxyIO for automated testing.
-     * [SMX4KNL-75] - Modify Shell argument processing to execute multiple commands.
-     * [SMX4KNL-77] - The deployer should keep a list of installed bundles that failed to start and retry those when new bundles have been resolved
-     * [SMX4KNL-78] - Small refactoring of the Feature interface
-
-
-
-                  Apache ServiceMix Kernel 1.0.0-rc2
-                  ==================================
-
-Overview
---------
-
-This second Release Candidate of Apache ServiceMix Kernel includes a few bug fixes and a few new features.
-The main change is that the system folder that contains the OSGi bundles to install in the runtime is now
-organized as a maven 2 repository, though it should not directly affect users.  A more detailed changelog
-is following. 
-    
-Changelog
----------
-    
-The following list shows the bug fixes and enhancements included in this release:
-
-** Bug
-    * [SMX4KNL-34] - snapshot jar name mismatch in startup.properties and in the system folder
-    * [SMX4KNL-52] - Deployment of pain spring files does not work when using xml extensions because these are not available in the classpath
-    * [SMX4KNL-53] - During starting, files are redeployed several times, one each time a new Deployer is registered in OSGi
-    * [SMX4KNL-54] - Kernel does not start if system property "felix.cache.profiledir" is not defined
-    * [SMX4KNL-56] - Kernel does not start on Windows if classpath contains spaces
-    * [SMX4KNL-58] - Hot-deploy capability of FileMonitor does not update bundles properly on Windows.
-    * [SMX4KNL-63] - Possible deadlock at startup caused by the filedeployer not running in its own thread the first time
-    * [SMX4KNL-64] - The list of repositories for the features shell is not persisted across restart
-    * [SMX4KNL-65] - After copying or moving the kernel, it does not start in a very clean way anymore
-    * [SMX4KNL-68] - failed to start smx4
-
-** Improvement
-    * [SMX4KNL-51] - Add a configuration file for the maven url handler so that adding default repositories is easy enough
-    * [SMX4KNL-55] - Use maven shade plugin on the main module so that sources jar is correct
-    * [SMX4KNL-66] - When the file monitor loads configuration for the config admin, allow the use of system properties using ${xxx}
-
-** New Feature
-    * [SMX4KNL-61] - Organize the system folder as a maven 2 repository
-    * [SMX4KNL-67] - Allow the features service to obtain a list of features to install at startup
-
-** Task
-    * [SMX4KNL-57] - Extract bundles from the svn tree
-    * [SMX4KNL-59] - Upgrade to spring 2.5.5 / spring-dm 1.1.0
-
-
-
-                  Apache ServiceMix Kernel 1.0-rc1
-                  ================================
-
-This first Release Candidate of Apache ServiceMix Kernel includes a security framework based on
-JAAS allowing authentication using JAAS realms deployed at runtime and also allow keystores and
-trustores to be deployed and accessed through OSGi.  This allow the remote console to be secured
-correctly (if the console is activated in a production environment, we strongly recommand to 
-deploy a custom JAAS realm and new keystores when using the SSL connection).  A few bugs have been
-fixed too.
-
-A release candidate (RC) is a distribution that has not been proven completely stable, but the 
-feature set is the one that will be available in the final release.   The number of RCs has not 
-been fixed and it will depend on the feedback we obtain from this release, so please give it a try
-and report any problems you can find.
-
-** Bug
-    * [SMX4KNL-38] - Fix NullPointerException instead of Command not found in the console
-    * [SMX4KNL-40] - Remote console does not display output
-    * [SMX4KNL-41] - When using the remote command on the client from the command line, the process does not exit correctly
-    * [SMX4KNL-44] - Changed bundles restarted twice
-    * [SMX4KNL-45] - The "log display" command does not display anything when running from an instance that has been created using the "admin create" command
-    * [SMX4KNL-46] - After using the 'admin create' command, cpu goes to 100% until another command is entered
-    * [SMX4KNL-48] - ulimit error on MacOS X Leopard 10.5
-    * [SMX4KNL-50] - Kernel does not start on Windows
-
-** Improvement
-    * [SMX4KNL-39] - Make bundle locations for SMX configurable
-    * [SMX4KNL-49] - Upgrade to Spring 2.5.4, Spring-DM 1.1.0-m2, PaxLogging 1.1.1
-
-** New Feature
-    * [SMX4KNL-35] - Secure the connection between the client and the kernel in some way
-    * [SMX4KNL-37] - JAAS support
-
-
-                  Apache ServiceMix Kernel 1.0-m3
-                  ================================
-
-This third milestone of Apache ServiceMix Kernel brings a lot of new features:
-  * a provisioning system to install applications easily
-  * a log shell to visualize the logging output and change log levels
-  * pipe support on commands
-  * a bunch of new commands: history, grep, cat, ava, exec, sleep
-
-Note that this milestone does not include the latest spring version because 
-the latest ones have wrong OSGi manifest headers and do not work.
-
-** Bug
-    * [SMX4KNL-22] - The console can not be reloaded at runtime
-    * [SMX4KNL-29] - Shell commands are not unregistered automatically when the last command is unregistered
-    * [SMX4KNL-31] - Aliases do not work when inside a subshell
-
-** Improvement
-    * [SMX4KNL-5] - Show gshell sub-shell name in prompt
-    * [SMX4KNL-6] - Error Message improvement on Gshell console.
-    * [SMX4KNL-10] - Handle dependant features correctly
-    * [SMX4KNL-21] - Allow pipes in command syntax
-    * [SMX4KNL-25] - Feature commands enhancement.
-    * [SMX4KNL-32] - Lazy load feature repositories to avoid delay when the url can not be accessed or things like that
-
-** New Feature
-    * [SMX4KNL-1] - Implements a log command
-    * [SMX4KNL-11] - Provisioning system
-    * [SMX4KNL-20] - Adding a new OBR command to reload the repository url's
-    * [SMX4KNL-23] - Add a grep command
-    * [SMX4KNL-24] - Add a few utils commands: cat, java, exec, sleep
-    * [SMX4KNL-26] - Spring URL handler to wrap xml spring files into bundles for direct installation.
-    * [SMX4KNL-27] - Include an implementation of the Preferences service
-    * [SMX4KNL-30] - Create an history command to be able to browse previous commands easily
-
-
-                  Apache ServiceMix Kernel 1.0-m2
-                  ================================
-
-This is the second milestone of ServiceMix Kernel, but mostly a bug fix release
-compared to the first milestone.
-
-** Bug
-    * [SMX4KNL-13] - startup issue in recognizing new files in deploy folder
-    * [SMX4KNL-15] - Display of memory size using the info command on Windows is ugly
-    * [SMX4KNL-16] - Bad error message when startup.properties lists a unknown file (the file name is not displayed, but 'null' instead)
-    * [SMX4KNL-18] - No need for DynamicImport-Package=* in filemonitor
-    * [SMX4KNL-19] - Performance problems when using the OSGi classloaders in a certain way
-
-** Improvement
-    * [SMX4KNL-4] - Add a start option on the 'osgi install' command so that the bundle is automatically started
-
-** Task
-    * [SMX4KNL-17] - Remove all the warnings when building the distribution tar.gz
-
-See the README.txt file for more general informations about ServiceMix Kernel.
-
-
-                  Apache ServiceMix Kernel 1.0-m1
-                  ================================
-
-See the README.txt file for more general informations about ServiceMix Kernel.
-
-This is the first milestone of ServiceMix Kernel.  All the features are not 
-fully implemented yet and things may be changed until the final 1.0 release.
-Please refer to the web site for more informations and feel free to ask any
-questions on the ServiceMix mailing lists or simply to provide feedback 
-(we appreciate it very much).
-
-Thanks you for downloading ServiceMix Kernel.  Enjoy !
-
-The ServiceMix Team
-http://servicemix.apache.org/team.html
-
diff --git a/karaf/admin/command/NOTICE b/karaf/admin/command/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/admin/command/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/admin/command/pom.xml b/karaf/admin/command/pom.xml
deleted file mode 100644
index 069e7de..0000000
--- a/karaf/admin/command/pom.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.admin</groupId>
-        <artifactId>admin</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.admin</groupId>
-    <artifactId>org.apache.felix.karaf.admin.command</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Admin Command</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.admin</groupId>
-            <artifactId>org.apache.felix.karaf.admin.core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</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>
-        <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>
-                            !${project.artifactId}*,
-                            !org.apache.felix.karaf.admin.internal,
-                            javax.management,
-                            javax.management.loading,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>
-                            org.apache.felix.karaf.admin.main
-                        </Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/AdminCommandSupport.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/AdminCommandSupport.java
deleted file mode 100644
index 617d1db..0000000
--- a/karaf/admin/command/src/main/java/org/apache/felix/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.felix.karaf.admin.command;
-
-import org.apache.felix.karaf.admin.AdminService;
-import org.apache.felix.karaf.admin.Instance;
-import org.apache.felix.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/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ChangePortCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ChangePortCommand.java
deleted file mode 100644
index e096399..0000000
--- a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ChangePortCommand.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.felix.karaf.admin.command;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "admin", name = "change-port", description = "Changes the port of an existing container instance.")
-public class ChangePortCommand 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 port to set", required = true, multiValued = false)
-    private int port = 0;
-
-    protected Object doExecute() throws Exception {
-        getExistingInstance(instance).changePort(port);
-        return null;
-    }
-}
diff --git a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ConnectCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ConnectCommand.java
deleted file mode 100644
index bf48a72..0000000
--- a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ConnectCommand.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.felix.karaf.admin.command;
-
-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 {
-
-    @Argument(index = 0, name="name", description="The name of the container instance", required = true, multiValued = false)
-    private String instance = null;
-
-    @Option(name="-u", aliases={"--username"}, description="Remote user name (Default: karaf)", required = false, multiValued = false)
-    private String username = "karaf";
-
-    @Option(name="-p", aliases={"--password"}, description="Remote user password (Default: karaf)", required = false, multiValued = false)
-    private String password = "karaf";
-
-    protected Object doExecute() throws Exception {
-        int port = getExistingInstance(instance).getPort();
-        session.execute("ssh -l " + username + " -P " + password + " -p " + port + " localhost");
-        return null;
-    }
-}
diff --git a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/CreateCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/CreateCommand.java
deleted file mode 100644
index a512fcb..0000000
--- a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/CreateCommand.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.felix.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.felix.karaf.admin.InstanceSettings;
-
-
-/**
- * Creates a new Karaf instance 
- *
- * @version $Rev: 679826 $ $Date: 2008-07-25 17:00:12 +0200 (Fri, 25 Jul 2008) $
- */
-@Command(scope = "admin", name = "create", description = "Creates a new container instance.")
-public class CreateCommand extends AdminCommandSupport
-{
-    @Option(name = "-p", aliases = {"--port"}, description = "Port number for remote shell connection", required = false, multiValued = false)
-    int port = 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 = "-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(port, location, featureURLs, features);
-        getAdminService().createInstance(instance, settings);
-        return null;
-    }
-
-}
diff --git a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/DestroyCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/DestroyCommand.java
deleted file mode 100644
index 88919cb..0000000
--- a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/DestroyCommand.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.felix.karaf.admin.command;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-
-/**
- * Destroy an existing Karaf instance
- *
- * @version $Rev: 679826 $ $Date: 2008-07-25 17:00:12 +0200 (Fri, 25 Jul 2008) $
- */
-@Command(scope = "admin", name = "destroy", description = "Destroys an existing container instance.")
-public class DestroyCommand extends AdminCommandSupport
-{
-    @Argument(index = 0, name = "name", description="The name of the container instance to destroy", required = true, multiValued = false)
-    private String instance = null;
-
-    protected Object doExecute() throws Exception {
-        getExistingInstance(instance).destroy();
-        return null;
-    }
-
-}
diff --git a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ListCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ListCommand.java
deleted file mode 100644
index bf15909..0000000
--- a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ListCommand.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.felix.karaf.admin.command;
-
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.karaf.admin.Instance;
-
-/**
- * List available instances
- */
-@Command(scope = "admin", name = "list", description = "List 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;
-
-    protected Object doExecute() throws Exception {
-        Instance[] instances = getAdminService().getInstances();
-        if (location) {
-            System.out.println("  Port   State       Pid  Location");
-        } else {
-            System.out.println("  Port   State       Pid  Name");
-        }
-        for (Instance instance : instances) {
-            StringBuilder sb = new StringBuilder();
-            sb.append('[');
-            String s = Integer.toString(instance.getPort());
-            for (int i = s.length(); i < 5; i++) {
-                sb.append(' ');
-            }
-            sb.append(s);
-            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 (location) {
-                sb.append(instance.getLocation());
-            } else {
-                sb.append(instance.getName());
-            }
-            System.out.println(sb.toString());
-        }
-        return null;
-    }
-
-}
diff --git a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StartCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StartCommand.java
deleted file mode 100644
index c14947c..0000000
--- a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StartCommand.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.felix.karaf.admin.command;
-
-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 = "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;
-
-    @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).start(javaOpts);
-        return null;
-    }
-}
diff --git a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StopCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StopCommand.java
deleted file mode 100644
index 1ad5789..0000000
--- a/karaf/admin/command/src/main/java/org/apache/felix/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.felix.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/admin/command/src/main/java/org/apache/felix/karaf/admin/command/completers/InstanceCompleter.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/completers/InstanceCompleter.java
deleted file mode 100644
index 467989f..0000000
--- a/karaf/admin/command/src/main/java/org/apache/felix/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.felix.karaf.admin.command.completers;
-
-import java.util.List;
-
-import org.apache.felix.karaf.admin.AdminService;
-import org.apache.felix.karaf.admin.Instance;
-import org.apache.felix.karaf.shell.console.completer.StringsCompleter;
-import org.apache.felix.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/admin/command/src/main/java/org/apache/felix/karaf/admin/main/Execute.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/main/Execute.java
deleted file mode 100644
index 5466d7c..0000000
--- a/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/main/Execute.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.felix.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.felix.karaf.admin.command.AdminCommandSupport;
-import org.apache.felix.karaf.admin.command.ChangePortCommand;
-import org.apache.felix.karaf.admin.command.CreateCommand;
-import org.apache.felix.karaf.admin.command.DestroyCommand;
-import org.apache.felix.karaf.admin.command.ListCommand;
-import org.apache.felix.karaf.admin.command.StartCommand;
-import org.apache.felix.karaf.admin.command.StopCommand;
-import org.apache.felix.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,
-        ChangePortCommand.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;
-
-    public static void main(String[] args) throws Exception {
-        AnsiConsole.systemInstall();
-
-        if (args.length == 0) {
-            listCommands();
-            exit(0);
-        }
-        
-        Class<?> cls = COMMANDS.get(args[0]);
-        if (cls == null) {
-            System.err.println("Command not found: " + args[0]);
-            exit(-1);
-        }
-
-        String storage = System.getProperty("storage.location");
-        if (storage == null) {
-            System.err.println("System property 'storage.location' 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());
-        
-        Object command = cls.newInstance();
-        if (command instanceof AdminCommandSupport) {
-            execute((AdminCommandSupport) command, storageFile, args);            
-        } else {
-            System.err.println("Not an admin command: " + args[0]);
-            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/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml b/karaf/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml
deleted file mode 100644
index 2a62839..0000000
--- a/karaf/admin/command/src/main/resources/OSGI-INF/blueprint/admin-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"
-           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
-           default-activation="lazy">
-
-    <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="admin/create">
-            <action class="org.apache.felix.karaf.admin.command.CreateCommand">
-                <property name="adminService" ref="adminService" />
-            </action>
-        </command>
-        <command name="admin/connect">
-            <action class="org.apache.felix.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.felix.karaf.admin.command.ListCommand">
-                <property name="adminService" ref="adminService" />
-            </action>
-        </command>
-        <command name="admin/start">
-            <action class="org.apache.felix.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.felix.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.felix.karaf.admin.command.DestroyCommand">
-                <property name="adminService" ref="adminService" />
-            </action>
-            <completers>
-                <ref component-id="instanceCompleter" />
-                <null/>
-            </completers>
-        </command>
-        <command name="admin/change-port">
-            <action class="org.apache.felix.karaf.admin.command.ChangePortCommand">
-                <property name="adminService" ref="adminService" />
-            </action>
-            <completers>
-                <ref component-id="instanceCompleter" />
-                <null/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <reference id="adminService" interface="org.apache.felix.karaf.admin.AdminService" />
-
-    <bean id="instanceCompleter" class="org.apache.felix.karaf.admin.command.completers.InstanceCompleter">
-        <property name="adminService" ref="adminService" />
-    </bean>
-    
-</blueprint>
diff --git a/karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/command/CreateCommandTest.java b/karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/command/CreateCommandTest.java
deleted file mode 100644
index b467713..0000000
--- a/karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/command/CreateCommandTest.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.felix.karaf.admin.command;
-
-import java.util.Arrays;
-import java.util.Collections;
-
-import junit.framework.TestCase;
-
-import org.apache.felix.karaf.admin.AdminService;
-import org.apache.felix.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.port = 9941;
-        cc.location = "top";
-        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, "top", 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/admin/command/src/test/java/org/apache/felix/karaf/admin/main/ExecuteTest.java b/karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/main/ExecuteTest.java
deleted file mode 100644
index 268549b..0000000
--- a/karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/main/ExecuteTest.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.felix.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.felix.karaf.admin.AdminService;
-import org.apache.felix.karaf.admin.command.AdminCommandSupport;
-import org.apache.felix.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("storage.location"));
-            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("storage.location", 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("storage.location"));
-            delete(tempFile);
-        }        
-    }
-    
-    public void testExecute() throws Exception {
-        final File tempFile = createTempDir(getName());
-        Properties p = new Properties();
-        p.setProperty("port", "1302");
-        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 field = AdminServiceImpl.class.getDeclaredField("defaultPortStart");
-                    field.setAccessible(true);
-                    assertEquals(1302, field.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/admin/core/NOTICE b/karaf/admin/core/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/admin/core/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/admin/core/pom.xml b/karaf/admin/core/pom.xml
deleted file mode 100644
index 0a784eb..0000000
--- a/karaf/admin/core/pom.xml
+++ /dev/null
@@ -1,193 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.admin</groupId>
-        <artifactId>admin</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.admin</groupId>
-    <artifactId>org.apache.felix.karaf.admin.core</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Admin Core</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</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.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.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>
-        </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/felix/karaf/admin/etc</outputDirectory>
-                            <resources>
-                                <resource>
-                                    <directory>../../assembly/src/main/distribution/text/etc/</directory>
-                                    <includes>
-                                        <include>*.properties</include>
-                                        <include>*.cfg</include>
-                                    </includes>
-                                    <excludes>
-                                        <exclude>org.apache.felix.karaf.shell.cfg</exclude>
-                                        <exclude>org.ops4j.pax.url.mvn.cfg</exclude>
-                                        <exclude>system.properties</exclude>
-                                    </excludes>
-                                </resource>
-                            </resources>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>copy-filtered</id>
-                        <!-- here the phase you need -->
-                        <phase>compile</phase>
-                        <goals>
-                            <goal>copy-resources</goal>
-                        </goals>
-                        <configuration>
-                            <outputDirectory>${basedir}/target/classes/org/apache/felix/karaf/admin/etc</outputDirectory>
-                            <resources>
-                                <resource>
-                                    <directory>../../assembly/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>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Export-Package>
-                            org.apache.felix.karaf.admin;version=${project.version},
-                            org.apache.felix.karaf.jpm;version=${project.version}
-                        </Export-Package>
-                        <Import-Package>
-                            !org.apache.felix.karaf.admin,
-                            !org.apache.felix.karaf.jpm,
-                            javax.management,
-                            javax.management.loading,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>
-                            org.apache.felix.karaf.admin.bin,
-                            org.apache.felix.karaf.admin.etc,
-                            org.apache.felix.karaf.admin.internal,
-                            org.apache.felix.karaf.jpm.impl,
-                        </Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </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/admin/core/src/main/java/org/apache/felix/karaf/admin/AdminService.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/AdminService.java
deleted file mode 100644
index e8d1cb5..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/AdminService.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.felix.karaf.admin;
-
-public interface AdminService {
-
-    Instance createInstance(String name, InstanceSettings settings) throws Exception;
-
-    Instance[] getInstances();
-
-    Instance getInstance(String name);    
-}
diff --git a/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/Instance.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/Instance.java
deleted file mode 100644
index 259704d..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/Instance.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.karaf.admin;
-
-public interface Instance {
-
-    String STOPPED = "Stopped";
-    String STARTING = "Starting";
-    String STARTED = "Started";
-    String ERROR = "Error";
-
-    String getName();
-    
-    boolean isRoot();
-
-    String getLocation();
-
-    int getPid();
-
-    int getPort();
-
-    void changePort(int port) throws Exception;
-
-    void start(String javaOpts) throws Exception;
-
-    void stop() throws Exception;
-
-    void destroy() throws Exception;
-
-    String getState() throws Exception;
-
-}
diff --git a/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/InstanceSettings.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/InstanceSettings.java
deleted file mode 100644
index 832e24f..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/InstanceSettings.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.felix.karaf.admin;
-
-import java.util.List;
-
-public class InstanceSettings {
-    private final int port;
-    private final String location;
-    private final List<String> featureURLs;
-    private final List<String> features;
-
-    public InstanceSettings(int port, String location, List<String> featureURLs, List<String> features) {
-        this.port = port;
-        this.location = location;
-        this.featureURLs = featureURLs;
-        this.features = features;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public String getLocation() {
-        return location;
-    }
-
-    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.port == port &&
-               (location == null ? is.location == null : location.equals(is.location)) &&
-               (featureURLs == null ? is.featureURLs == null : featureURLs.equals(is.featureURLs)) &&
-               (features == null ? is.features == null : features.equals(is.features));
-    }
-
-    @Override
-    public int hashCode() {
-        int rc = 17;
-        rc = 37 * port;
-        if (location != null) {
-            rc = 37 * location.hashCode();
-        }
-        if (featureURLs != null) {
-            rc = 37 * featureURLs.hashCode();
-        }
-        if (features != null) {
-            rc = 37 * features.hashCode();
-        }
-        return rc;
-    }
-    
-    
-}
diff --git a/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/AdminServiceImpl.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/AdminServiceImpl.java
deleted file mode 100644
index 69c7f4c..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/AdminServiceImpl.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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.felix.karaf.admin.AdminService;
-import org.apache.felix.karaf.admin.Instance;
-import org.apache.felix.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";
-    private static final String FEATURES_CFG = "etc/org.apache.felix.karaf.features.cfg";
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(AdminServiceImpl.class);
-
-    private Map<String, Instance> instances = new HashMap<String, Instance>();
-
-    private int defaultPortStart = 8101;
-
-    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"));
-            defaultPortStart = Integer.parseInt(storage.getProperty("port", Integer.toString(defaultPortStart)));
-            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);
-                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, root);
-                    if (pid > 0) {
-                        try {
-                            instance.attach(pid);
-                        } catch (IOException e) {
-                            // Ignore
-                        }
-                    }
-                    newInstances.put(name, instance);
-                }
-            }
-            instances = newInstances;
-        } catch (Exception e) {
-            LOGGER.warn("Unable to reload Karaf instance list", e);
-        }
-    }
-
-    public synchronized Instance createInstance(String name, InstanceSettings settings) throws Exception {
-        if (instances.get(name) != null) {
-            throw new IllegalArgumentException("Instance '" + name + "' already exists");
-        }
-        String loc = settings.getLocation() != null ? settings.getLocation() : name;
-        File karafBase = new File(loc);
-        if (!karafBase.isAbsolute()) {
-            karafBase = new File(storageLocation, loc);
-        }
-        int sshPort = settings.getPort();
-        if (sshPort <= 0) {
-            sshPort = ++defaultPortStart;
-        }
-        println(Ansi.ansi().a("Creating new instance on port ").a(sshPort).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/java.util.logging.properties", true);
-        copyResourceToDir(karafBase, "etc/org.apache.felix.fileinstall-deploy.cfg", true);
-        copyResourceToDir(karafBase, "etc/org.apache.felix.karaf.log.cfg", true);
-        copyResourceToDir(karafBase, FEATURES_CFG, true);
-        copyResourceToDir(karafBase, "etc/org.apache.felix.karaf.management.cfg", true);
-        copyResourceToDir(karafBase, "etc/org.ops4j.pax.logging.cfg", true);
-        copyResourceToDir(karafBase, "etc/org.ops4j.pax.url.mvn.cfg", true);
-        copyResourceToDir(karafBase, "etc/startup.properties", true);
-        copyResourceToDir(karafBase, "etc/users.properties", true);
-
-        HashMap<String, String> props = new HashMap<String, String>();
-        props.put("${SUBST-KARAF-NAME}", name);
-        props.put("${SUBST-KARAF-HOME}", System.getProperty("karaf.home"));
-        props.put("${SUBST-KARAF-BASE}", karafBase.getPath());
-        props.put("${SUBST-SSH-PORT}", Integer.toString(sshPort));
-        copyFilteredResourceToDir(karafBase, "etc/system.properties", props);
-        copyFilteredResourceToDir(karafBase, "etc/org.apache.felix.karaf.shell.cfg", props);
-        if( System.getProperty("os.name").startsWith("Win") ) {
-            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);
-            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);
-        
-        Instance instance = new InstanceImpl(this, name, karafBase.toString());
-        instances.put(name, instance);
-        saveState();
-        return instance;
-    }
-
-    void handleFeatures(File featuresCfg, InstanceSettings settings) throws IOException {
-        Properties p = loadStorage(featuresCfg);
-
-        appendToPropList(p, "featuresBoot", settings.getFeatures());
-        appendToPropList(p, "featuresRepositories", settings.getFeatureURLs());
-        saveStorage(p, featuresCfg, "Features Configuration");
-    }
-
-    private void appendToPropList(Properties p, String key, List<String> elements) {
-        if (elements == null) {
-            return;
-        }
-        StringBuilder sb = new StringBuilder(p.getProperty(key).trim());
-        for (String f : elements) {
-            if (sb.length() > 0) {
-                sb.append(',');
-            }
-            sb.append(f);
-        }
-        p.setProperty(key, sb.toString());
-    }
-    
-    public synchronized Instance[] getInstances() {
-        return instances.values().toArray(new Instance[0]);
-    }
-
-    public synchronized Instance getInstance(String name) {
-        return instances.get(name);
-    }
-
-    synchronized void forget(String name) {
-        instances.remove(name);
-    }
-
-    synchronized void saveState() throws IOException {
-        Properties storage = new Properties();
-        Instance[] data = getInstances();
-        storage.setProperty("port", Integer.toString(defaultPortStart));
-        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 + ".loc", data[i].getLocation());
-            storage.setProperty("item." + i + ".pid", Integer.toString(data[i].getPid()));
-        }
-        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/felix/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 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/felix/karaf/admin/" + 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);
-            }
-        }
-    }
-
-    private void safeClose(InputStream is) throws IOException {
-        if (is == null) {
-            return;
-        }
-        try {
-            is.close();
-        } catch (Throwable ignore) {
-        }
-    }
-
-    private void safeClose(OutputStream is) throws IOException {
-        if (is == null) {
-            return;
-        }
-        try {
-            is.close();
-        } catch (Throwable ignore) {
-        }
-    }
-
-    private String filter(String line, HashMap<String, String> props) {
-        for (Map.Entry<String, String> i : props.entrySet()) {
-            int p1 = line.indexOf(i.getKey());
-            if( p1 >= 0 ) {
-                String l1 = line.substring(0, p1);
-                String l2 = line.substring(p1+i.getKey().length());
-                line = l1+i.getValue()+l2;
-            }
-        }
-        return line;
-    }
-
-    private void mkdir(File karafBase, String path) {
-        File file = new File(karafBase, path);
-        if( !file.exists() ) {
-            println(Ansi.ansi().a("Creating dir:  ").a(Ansi.Attribute.INTENSITY_BOLD).a(file.getPath()).a(Ansi.Attribute.RESET).toString());
-            file.mkdirs();
-        }
-    }
-
-    private int chmod(File serviceFile, String mode) throws Exception {
-        ProcessBuilder builder = new ProcessBuilder();
-        builder.command("chmod", mode, serviceFile.getCanonicalPath());
-        Process p = builder.start();
-
-        // gnodet: Fix SMX4KNL-46: cpu goes to 100% after running the 'admin create' command
-        // Not sure exactly what happens, but commenting the process io redirection seems
-        // to work around the problem.
-        //
-        //PumpStreamHandler handler = new PumpStreamHandler(io.inputStream, io.outputStream, io.errorStream);
-        //handler.attach(p);
-        //handler.start();
-        int status = p.waitFor();
-        //handler.stop();
-        return status;
-    }
-
-}
diff --git a/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/InstanceImpl.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/InstanceImpl.java
deleted file mode 100644
index ed27f4a..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/InstanceImpl.java
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.admin.internal;
-
-import java.io.*;
-import java.net.Socket;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.felix.karaf.admin.Instance;
-import org.apache.felix.karaf.jpm.Process;
-import org.apache.felix.karaf.jpm.ProcessBuilderFactory;
-import org.apache.felix.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 Process process;
-    private boolean root;
-
-    public InstanceImpl(AdminServiceImpl service, String name, String location) {
-        this(service, name, location, false);
-    }
-    
-    public InstanceImpl(AdminServiceImpl service, String name, String location, boolean root) {
-        this.service = service;
-        this.name = name;
-        this.location = location;
-        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 boolean isRoot() {
-        return root;
-    }
-
-    public String getLocation() {
-        return location;
-    }
-
-    public boolean exists() {
-        return new File(location).isDirectory();
-    }
-
-    public int getPid() {
-        checkProcess();
-        return this.process != null ? this.process.getPid() : 0;
-    }
-
-    public int getPort() {
-        InputStream is = null;
-        try {
-            File f = new File(location, "etc/org.apache.felix.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 changePort(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.felix.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 synchronized void start(String javaOpts) throws Exception {
-        checkProcess();
-        if (this.process != null) {
-            throw new IllegalStateException("Instance already started");
-        }
-        if (javaOpts == null) {
-            javaOpts = "-server -Xmx512M -Dcom.sun.management.jmxremote";
-        }
-        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
-                + " -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.felix.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 = getPort();
-        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"));
-            for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
-                String name = (String) e.nextElement();
-                props.setProperty(name,
-                        substVars(props.getProperty(name), name, null, props));
-            }
-            int port = Integer.parseInt(props.getProperty(KARAF_SHUTDOWN_PORT, "0"));
-            String host = props.getProperty(KARAF_SHUTDOWN_HOST, "localhost");
-            String portFile = props.getProperty(KARAF_SHUTDOWN_PORT_FILE);
-            String shutdown = props.getProperty(KARAF_SHUTDOWN_COMMAND, DEFAULT_SHUTDOWN_COMMAND);
-            if (port == 0 && portFile != null) {
-                BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(portFile)));
-                String portStr = r.readLine();
-                port = Integer.parseInt(portStr);
-                r.close();
-            }
-            // We found the port, try to send the command
-            if (port > 0) {
-                Socket s = new Socket(host, port);
-                s.getOutputStream().write(shutdown.getBytes());
-                s.close();
-                long t = System.currentTimeMillis() + service.getStopTimeout();
-                do {
-                    Thread.sleep(100);
-                    checkProcess();
-                } while (System.currentTimeMillis() < t && process != null);
-            }
-        } catch (Exception e) {
-            LOG.debug("Unable to cleanly shutdown instance", e);
-        }
-    }
-
-    protected static boolean deleteFile(File fileToDelete) {
-        if (fileToDelete == null || !fileToDelete.exists()) {
-            return true;
-        }
-        boolean result = true;
-        if (fileToDelete.isDirectory()) {
-            File[] files = fileToDelete.listFiles();
-            if (files == null) {
-                result = false;
-            } else {
-                for (int i = 0; i < files.length; i++) {
-                    File file = files[i];
-                    if (file.getName().equals(".") || file.getName().equals("..")) {
-                        continue;
-                    }
-                    if (file.isDirectory()) {
-                        result &= deleteFile(file);
-                    } else {
-                        result &= file.delete();
-                    }
-                }
-            }
-        }
-        result &= fileToDelete.delete();
-        return result;
-    }
-
-    protected static Properties loadPropertiesFile(URL configPropURL) throws Exception {
-        // Read the properties file.
-        Properties configProps = new Properties();
-        InputStream is = null;
-        try {
-            is = configPropURL.openConnection().getInputStream();
-            configProps.load(is);
-            is.close();
-        }
-        catch (Exception ex) {
-            System.err.println(
-                    "Error loading config properties from " + configPropURL);
-            System.err.println("Main: " + ex);
-            try {
-                if (is != null) is.close();
-            }
-            catch (IOException ex2) {
-                // Nothing we can do.
-            }
-            return null;
-        }
-        return configProps;
-    }
-
-    private static final String DELIM_START = "${";
-    private static final String DELIM_STOP = "}";
-
-    protected static String substVars(String val, String currentKey,
-                                      Map<String, String> cycleMap, Properties configProps)
-            throws IllegalArgumentException {
-        // If there is currently no cycle map, then create
-        // one for detecting cycles for this invocation.
-        if (cycleMap == null) {
-            cycleMap = new HashMap<String, String>();
-        }
-
-        // Put the current key in the cycle map.
-        cycleMap.put(currentKey, currentKey);
-
-        // Assume we have a value that is something like:
-        // "leading ${foo.${bar}} middle ${baz} trailing"
-
-        // Find the first ending '}' variable delimiter, which
-        // will correspond to the first deepest nested variable
-        // placeholder.
-        int stopDelim = val.indexOf(DELIM_STOP);
-
-        // Find the matching starting "${" variable delimiter
-        // by looping until we find a start delimiter that is
-        // greater than the stop delimiter we have found.
-        int startDelim = val.indexOf(DELIM_START);
-        while (stopDelim >= 0) {
-            int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length());
-            if ((idx < 0) || (idx > stopDelim)) {
-                break;
-            } else if (idx < stopDelim) {
-                startDelim = idx;
-            }
-        }
-
-        // If we do not have a start or stop delimiter, then just
-        // return the existing value.
-        if ((startDelim < 0) && (stopDelim < 0)) {
-            return val;
-        }
-        // At this point, we found a stop delimiter without a start,
-        // so throw an exception.
-        else if (((startDelim < 0) || (startDelim > stopDelim))
-                && (stopDelim >= 0)) {
-            throw new IllegalArgumentException(
-                    "stop delimiter with no start delimiter: "
-                            + val);
-        }
-
-        // At this point, we have found a variable placeholder so
-        // we must perform a variable substitution on it.
-        // Using the start and stop delimiter indices, extract
-        // the first, deepest nested variable placeholder.
-        String variable =
-                val.substring(startDelim + DELIM_START.length(), stopDelim);
-
-        // Verify that this is not a recursive variable reference.
-        if (cycleMap.get(variable) != null) {
-            throw new IllegalArgumentException(
-                    "recursive variable reference: " + variable);
-        }
-
-        // Get the value of the deepest nested variable placeholder.
-        // Try to configuration properties first.
-        String substValue = (configProps != null)
-                ? configProps.getProperty(variable, null)
-                : null;
-        if (substValue == null) {
-            // Ignore unknown property values.
-            substValue = System.getProperty(variable, "");
-        }
-
-        // Remove the found variable from the cycle map, since
-        // it may appear more than once in the value and we don't
-        // want such situations to appear as a recursive reference.
-        cycleMap.remove(variable);
-
-        // Append the leading characters, the substituted value of
-        // the variable, and the trailing characters to get the new
-        // value.
-        val = val.substring(0, startDelim)
-                + substValue
-                + val.substring(stopDelim + DELIM_STOP.length(), val.length());
-
-        // Now perform substitution again, since there could still
-        // be substitutions to make.
-        val = substVars(val, currentKey, cycleMap, configProps);
-
-        // Return the value.
-        return val;
-    }
-
-}
diff --git a/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/Process.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/Process.java
deleted file mode 100644
index 0644f50..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/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.felix.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/admin/core/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilder.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilder.java
deleted file mode 100644
index a81cf36..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/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.felix.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.felix.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.felix.karaf.jpm.Process attach(int pid) throws IOException;
-
-}
diff --git a/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilderFactory.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilderFactory.java
deleted file mode 100644
index 6c4980c..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/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.felix.karaf.jpm;
-
-import java.lang.*;
-
-import org.apache.felix.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/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderFactoryImpl.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderFactoryImpl.java
deleted file mode 100644
index 23ee364..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/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.felix.karaf.jpm.impl;
-
-import org.apache.felix.karaf.jpm.ProcessBuilder;
-import org.apache.felix.karaf.jpm.ProcessBuilderFactory;
-
-public class ProcessBuilderFactoryImpl extends ProcessBuilderFactory {
-
-    public ProcessBuilder newBuilder() {
-        return new ProcessBuilderImpl();
-    }
-}
diff --git a/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderImpl.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderImpl.java
deleted file mode 100644
index c6b622e..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/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.felix.karaf.jpm.impl;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.felix.karaf.jpm.Process;
-import org.apache.felix.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/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessImpl.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessImpl.java
deleted file mode 100644
index 27dec49..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/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.felix.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.felix.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 proces, 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/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ScriptUtils.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ScriptUtils.java
deleted file mode 100644
index 0f29087..0000000
--- a/karaf/admin/core/src/main/java/org/apache/felix/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.felix.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/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml b/karaf/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml
deleted file mode 100644
index 4f994a8..0000000
--- a/karaf/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.felix.karaf.admin.internal.AdminServiceImpl" init-method="init">
-        <property name="storageLocation" value="${karaf.home}/instances" />
-    </bean>
-
-    <service ref="adminService" interface="org.apache.felix.karaf.admin.AdminService" />
-
-    <!-- Allow the use of system properties -->
-    <ext:property-placeholder />
-
-</blueprint>
diff --git a/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/karaf b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/karaf
deleted file mode 100644
index 8967cea..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/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/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/karaf.bat b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/karaf.bat
deleted file mode 100644
index 312b66c..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/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/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/start b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/start
deleted file mode 100644
index 333cba1..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/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/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/start.bat b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/start.bat
deleted file mode 100644
index 822ed42..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/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/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/stop b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/stop
deleted file mode 100644
index 459a488..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/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/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/stop.bat b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/stop.bat
deleted file mode 100644
index 31d92cb..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/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/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/org.apache.felix.karaf.shell.cfg b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/org.apache.felix.karaf.shell.cfg
deleted file mode 100644
index 7c5ab59..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/org.apache.felix.karaf.shell.cfg
+++ /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.
-#
-################################################################################
-
-#
-sshPort=${SUBST-SSH-PORT}
-sshHost=0.0.0.0
-sshRealm=karaf
-hostKey=${karaf.base}/etc/host.key
diff --git a/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/org.ops4j.pax.url.mvn.cfg b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/org.ops4j.pax.url.mvn.cfg
deleted file mode 100644
index 87480f2..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/org.ops4j.pax.url.mvn.cfg
+++ /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.
-#
-################################################################################
-
-#
-# If set to true, the following property will not allow any certificate to be used
-# when accessing maven repositories through SSL
-#
-#org.ops4j.pax.url.mvn.certificateCheck=
-
-#
-# Path to the local maven settings file.
-# The repositories defined in this file will be automatically added to the list
-# of default repositories if the 'org.ops4j.pax.url.mvn.repositories' property
-# below is not set.
-# The following locations are checked for the existence of the settings.xml file
-#   * 1. looks for the specified url
-#   * 2. if not found looks for ${user.home}/.m2/settings.xml
-#   * 3. if not found looks for ${maven.home}/conf/settings.xml
-#   * 4. if not found looks for ${M2_HOME}/conf/settings.xml
-#
-#org.ops4j.pax.url.mvn.settings=
-
-#
-# Path to the local maven repository which is used to avoid downloading
-# artifacts when they already exist locally.
-# The value of this property will be extracted from the settings.xml file
-# above, or defaulted to:
-#     System.getProperty( "user.home" ) + "/.m2/repository"
-#
-#org.ops4j.pax.url.mvn.localRepository=
-
-#
-# Comma separated list of repositories scanned when resolving an artifact.
-# Those repositories will be checked before iterating through the
-     below list of repositories and even before the local repository
-# A repository url can be appended with zero or more of the following flags:
-#    @snapshots  : the repository contains snaphots
-#    @noreleases : the repository does not contain any released artifacts
-#
-# The following property value will add the system folder as a repo.
-#
-org.ops4j.pax.url.mvn.defaultRepositories=file:${karaf.home}/${karaf.default.repository}@snapshots, \
-    file:${karaf.base}/${karaf.default.repository}@snapshots
-
-#
-# Comma separated list of repositories scanned when resolving an artifact.
-# The default list includes the following repositories:
-#    http://repo1.maven.org/maven2
-#    http://repository.ops4j.org/maven2
-# To add repositories to the default ones, prepend '+' to the list of repositories
-# to add.
-# A repository url can be appended with zero or more of the following flags:
-#    @snapshots  : the repository contains snaphots
-#    @noreleases : the repository does not contain any released artifacts
-#
-# The following property value will add the system folder as a repo.
-#
-org.ops4j.pax.url.mvn.repositories= \
-    http://repo1.maven.org/maven2, \
-    http://people.apache.org/repo/m2-snapshot-repository@snapshots@noreleases, \
-    http://repository.ops4j.org/maven2, \
-    http://svn.apache.org/repos/asf/servicemix/m2-repo, \
-    http://repository.springsource.com/maven/bundles/release, \
-    http://repository.springsource.com/maven/bundles/external
diff --git a/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/system.properties b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/system.properties
deleted file mode 100644
index d5fc11f..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/system.properties
+++ /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.
-#
-################################################################################
-
-#
-# The properties defined in this file will be made available through system
-# properties at the very beginning of the Karaf's boot process.
-#
-
-
-# Log level when the pax-logging service is not available
-# This level will only be used while the pax-logging service bundle
-# is not fully available.
-# To change log levels, please refer to the org.ops4j.pax.logging.cfg file
-# instead.
-org.ops4j.pax.logging.DefaultServiceLog.level=ERROR
-
-#
-# Name of this karaf instance.
-#
-karaf.name=${SUBST-KARAF-NAME}
-
-#
-# Default repository where bundles will be loaded from before using
-# other maven repositories.  For the full maven configuration, see
-# the org.ops4j.pax.url.mvn.cfg file.
-#
-karaf.default.repository=system
-
-#
-# Location of a shell script that will be run when starting a shell
-# session.  This script can be used to create aliases and define
-# additional commands.
-#
-karaf.shell.init.script=${karaf.home}/etc/shell.init.script
-
-#
-# Set this empty property to avoid errors when validating xml documents.
-#
-xml.catalog.files=
-
-#
-# Suppress the bell in the console when hitting backspace to many times
-# for example
-#
-jline.nobell=true
diff --git a/karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/unix/start.sh b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/unix/start.sh
deleted file mode 100644
index 1d1d720..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/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/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/destroy.vbs b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/destroy.vbs
deleted file mode 100644
index abd60eb..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/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/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/running.vbs b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/running.vbs
deleted file mode 100644
index 32c65c5..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/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/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/start.vbs b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/start.vbs
deleted file mode 100644
index 6004c86..0000000
--- a/karaf/admin/core/src/main/resources/org/apache/felix/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/admin/core/src/test/java/org/apache/felix/karaf/admin/InstanceSettingsTest.java b/karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/InstanceSettingsTest.java
deleted file mode 100644
index cce8c80..0000000
--- a/karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/InstanceSettingsTest.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.felix.karaf.admin;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-import org.apache.felix.karaf.admin.InstanceSettings;
-import org.junit.Assert;
-
-public class InstanceSettingsTest extends TestCase {
-    public void testInstanceSettings() {
-        InstanceSettings is =
-            new InstanceSettings(1, null, Collections.<String>emptyList(), Arrays.asList("hi"));
-        assertEquals(1, is.getPort());
-        Assert.assertNull(is.getLocation());
-        assertEquals(Arrays.asList("hi"), is.getFeatures());
-        assertEquals(0, is.getFeatureURLs().size());
-    }
-    
-    public void testEqualsHashCode() {
-        testEqualsHashCode(1, "top", Collections.<String>emptyList(), Arrays.asList("hi"));
-        testEqualsHashCode(0, null, null, null);
-    }
-
-    private void testEqualsHashCode(int port, String location, List<String> featureURLs, List<String> features) {
-        InstanceSettings is = new InstanceSettings(port, location, featureURLs, features);
-        InstanceSettings is2 = new InstanceSettings(port, location, featureURLs, features);
-        assertEquals(is, is2);
-        assertEquals(is.hashCode(), is2.hashCode());
-    }
-    
-    public void testEqualsHashCode2() {
-        InstanceSettings is = new InstanceSettings(1, "top", Collections.<String>emptyList(), Arrays.asList("hi"));
-        Assert.assertFalse(is.equals(null));
-        Assert.assertFalse(is.equals(new Object()));
-        assertEquals(is, is);
-    }
-}
diff --git a/karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/internal/AdminServiceImplTest.java b/karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/internal/AdminServiceImplTest.java
deleted file mode 100644
index 89dac42..0000000
--- a/karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/internal/AdminServiceImplTest.java
+++ /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.
- */
-package org.apache.felix.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.felix.karaf.admin.Instance;
-import org.apache.felix.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, 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, getName(), 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.felix.karaf.features.cfg");
-        assertFileExists(instance.getLocation(), "etc/org.apache.felix.fileinstall-deploy.cfg");
-        assertFileExists(instance.getLocation(), "etc/org.apache.felix.karaf.log.cfg");
-        assertFileExists(instance.getLocation(), "etc/org.apache.felix.karaf.management.cfg");
-        assertFileExists(instance.getLocation(), "etc/org.ops4j.pax.logging.cfg");
-        assertFileExists(instance.getLocation(), "etc/org.ops4j.pax.url.mvn.cfg");
-    }
-
-    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/admin/core/src/test/java/org/apache/felix/karaf/jpm/MainTest.java b/karaf/admin/core/src/test/java/org/apache/felix/karaf/jpm/MainTest.java
deleted file mode 100644
index 2d4c80a..0000000
--- a/karaf/admin/core/src/test/java/org/apache/felix/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.felix.karaf.jpm;
-
-public class MainTest {
-
-    public static void main(String[] args) throws Exception {
-        Thread.sleep(Long.parseLong(args[0]));
-    }
-}
diff --git a/karaf/admin/core/src/test/java/org/apache/felix/karaf/jpm/ProcessTest.java b/karaf/admin/core/src/test/java/org/apache/felix/karaf/jpm/ProcessTest.java
deleted file mode 100644
index 8b6ebc4..0000000
--- a/karaf/admin/core/src/test/java/org/apache/felix/karaf/jpm/ProcessTest.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.felix.karaf.jpm;
-
-import java.io.File;
-
-import junit.framework.TestCase;
-import org.apache.felix.karaf.jpm.impl.ScriptUtils;
-import org.apache.felix.karaf.jpm.ProcessBuilder;
-
-public class ProcessTest extends TestCase {
-
-    public void testCreate() throws Exception {
-        String javaPath = new File(System.getProperty("java.home"), ScriptUtils.isWindows() ? "bin\\java.exe" : "bin/java").getCanonicalPath();
-        System.err.println(javaPath);
-        StringBuilder command = new StringBuilder();
-        command.append(javaPath);
-        command.append(" -Dprop=\"key\"");
-        command.append(" -classpath ");
-        String clRes = getClass().getName().replace('.', '/') + ".class";
-        String str = getClass().getClassLoader().getResource(clRes).toString();
-        str = str.substring("file:".length(), 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.felix.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/admin/management/NOTICE b/karaf/admin/management/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/admin/management/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/admin/management/pom.xml b/karaf/admin/management/pom.xml
deleted file mode 100644
index 6b64a3b..0000000
--- a/karaf/admin/management/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.admin</groupId>
-        <artifactId>admin</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.admin</groupId>
-    <artifactId>org.apache.felix.karaf.admin.management</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Admin Management</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.admin</groupId>
-            <artifactId>org.apache.felix.karaf.admin.core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf</groupId>
-            <artifactId>org.apache.felix.karaf.management</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymockclassextension</artifactId>
-            <version>${easymock.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <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>
-                            !${project.artifactId}*,
-                            javax.management,
-                            javax.management.loading,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>org.apache.felix.karaf.admin.management.internal</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/AdminServiceMBean.java b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/AdminServiceMBean.java
deleted file mode 100644
index 0decb21..0000000
--- a/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/AdminServiceMBean.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.felix.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_PORT = "Port";
-    String INSTANCE_STATE = "State";
-    String INSTANCE_LOCATION = "Location";
-
-    String[] INSTANCE = {INSTANCE_PID, INSTANCE_NAME, INSTANCE_IS_ROOT, INSTANCE_PORT,
-            INSTANCE_STATE, INSTANCE_LOCATION };
-
-    // Operations
-    int createInstance(String name, int port, String location, String features, String featureURLs)
-            throws Exception;
-    void changePort(String name, int port) throws Exception;
-    void destroyInstance(String name) throws Exception;
-    void startInstance(String name, String opts) throws Exception;
-    void stopInstance(String name) throws Exception;
-
-    // Attributes
-    TabularData getInstances() throws Exception;
-
-}
diff --git a/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/codec/JmxInstance.java b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/codec/JmxInstance.java
deleted file mode 100644
index 264c5c9..0000000
--- a/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/codec/JmxInstance.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.felix.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.felix.karaf.admin.management.AdminServiceMBean;
-import org.apache.felix.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.getPort();
-            try {
-                itemValues[4] = instance.getState();
-            } catch (Exception e) {
-                itemValues[4] = "Error";
-            }
-            itemValues[5] = instance.getLocation();
-
-            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.STRING;
-            descriptions[4] = "The state of the instance.";
-
-            itemTypes[5] = SimpleType.STRING;
-            descriptions[5] = "The location 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/admin/management/src/main/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImpl.java b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImpl.java
deleted file mode 100644
index 9c0267a..0000000
--- a/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImpl.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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.felix.karaf.admin.management.AdminServiceMBean;
-import org.apache.felix.karaf.admin.AdminService;
-import org.apache.felix.karaf.admin.Instance;
-import org.apache.felix.karaf.admin.InstanceSettings;
-import org.apache.felix.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 port, String location, String features, String featureURLs)
-            throws Exception {
-        if ("".equals(location)) {
-            location = null;
-        }
-
-        InstanceSettings settings = new InstanceSettings(port, location,
-                parseStringList(featureURLs), parseStringList(features));
-
-        Instance inst = adminService.createInstance(name, settings);
-        if (inst != null) {
-            return inst.getPid();
-        } else {
-            return -1;
-        }
-    }
-
-    public void changePort(String name, int port) throws Exception {
-        getExistingInstance(name).changePort(port);
-    }
-
-    public void destroyInstance(String name) throws Exception {
-        getExistingInstance(name).destroy();
-    }
-
-    public void startInstance(String name, String opts) throws Exception {
-        getExistingInstance(name).start(opts);
-    }
-
-    public void stopInstance(String name) throws Exception {
-        getExistingInstance(name).stop();
-    }
-
-    public TabularData getInstances() throws Exception {
-        List<Instance> allInstances = Arrays.asList(adminService.getInstances());
-        List<JmxInstance> instances = new ArrayList<JmxInstance>();
-        for (Instance instance : allInstances) {
-            instances.add(new JmxInstance(instance));
-        }
-        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/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml b/karaf/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml
deleted file mode 100644
index a1d5d26..0000000
--- a/karaf/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">
-
-    <reference id="adminService" interface="org.apache.felix.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.felix.karaf.admin.management.internal.AdminServiceMBeanImpl">
-        <property name="adminService" ref="adminService" />
-    </bean>
-
-    <bean id="mbeanRegister" class="org.apache.felix.karaf.management.MBeanRegistrer">
-        <property name="mbeans">
-            <map>
-                <entry value="org.apache.felix.karaf:type=admin,name=${karaf.name}"
-                    key-ref="mbeanImpl" />
-            </map>
-        </property>
-    </bean>
-
-
-</blueprint>
diff --git a/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/codec/JmxInstanceTest.java b/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/codec/JmxInstanceTest.java
deleted file mode 100644
index f2f174b..0000000
--- a/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/codec/JmxInstanceTest.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.felix.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.felix.karaf.admin.Instance;
-import org.apache.felix.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.getPort()).andReturn(0);
-        EasyMock.expect(i.getState()).andThrow(new Exception("gotcha"));
-        EasyMock.expect(i.getLocation()).andReturn("somewhere");
-        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("Port"));
-        Assert.assertEquals("Error", cd.get("State"));
-        Assert.assertEquals("somewhere", cd.get("Location"));
-    }
-
-    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.getPort()).andReturn(0);
-        EasyMock.expect(i.getState()).andReturn("Started");
-        EasyMock.expect(i.getLocation()).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("Port"));
-        Assert.assertEquals("Started", cd.get("State"));
-        Assert.assertNull(cd.get("Location"));
-    }
-}
diff --git a/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImplTest.java b/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImplTest.java
deleted file mode 100644
index 11cb0c2..0000000
--- a/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImplTest.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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.felix.karaf.admin.AdminService;
-import org.apache.felix.karaf.admin.Instance;
-import org.apache.felix.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, "somewhere",
-                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, "somewhere", " webconsole,  funfeat", ""));
-    }
-    
-    public void testCreateInstance2() throws Exception {
-        final InstanceSettings is = new InstanceSettings(0, 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, "", "", ""));
-    }
-    
-    public void testGetInstances() throws Exception {       
-        Instance i1 = EasyMock.createMock(Instance.class);
-        EasyMock.expect(i1.getPid()).andReturn(1234);
-        EasyMock.expect(i1.getPort()).andReturn(8818);
-        EasyMock.expect(i1.getName()).andReturn("i1");
-        EasyMock.expect(i1.isRoot()).andReturn(true);
-        EasyMock.expect(i1.getLocation()).andReturn("somewhere");
-        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("somewhere"));
-        Assert.assertTrue(cd1.containsValue("Stopped"));
-
-        CompositeData cd2 = td.get(new Object [] {"i2"});
-        Assert.assertTrue(cd2.containsValue("i2"));
-    }
-    
-    public void testStartInstance() 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 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 testChangePort() throws Exception {
-        Instance inst = EasyMock.createMock(Instance.class);
-        inst.changePort(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.changePort("test instance", 7788);
-        EasyMock.verify(as);
-        EasyMock.verify(inst);
-    }
-}
diff --git a/karaf/admin/pom.xml b/karaf/admin/pom.xml
deleted file mode 100644
index 85bac79..0000000
--- a/karaf/admin/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.admin</groupId>
-    <artifactId>admin</artifactId>
-    <packaging>pom</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Admin</name>
-
-    <modules>
-        <module>core</module>
-        <module>command</module>
-        <module>management</module>
-    </modules>
-
-</project>
diff --git a/karaf/assembly/NOTICE b/karaf/assembly/NOTICE
deleted file mode 100644
index b7a517d..0000000
--- a/karaf/assembly/NOTICE
+++ /dev/null
@@ -1,58 +0,0 @@
-Apache Felix Karaf :: Assembly
-Copyright 2010 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 developed at
-The Eclipse Foundation (http://www.eclipse.org/).
-Licensed under Eclipse Public License 1.0.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This products includes software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-FUSE Source (http://www.fusesource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-JLine (http://jline.sourceforge.net).
-Licensed under the BSD License.
-
-This product includes 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
-
-The PDF manual has been generated using http://www.princexml.com/
-and contains an attribution which should not be removed by
-licensee.
-
-II. Used Software
-
-This product uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product uses software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-III. License Summary
-- Apache License 2.0
-- Eclipse Public License 1.0
-- BSD License
-- MIT License
-
-
diff --git a/karaf/assembly/pom.xml b/karaf/assembly/pom.xml
deleted file mode 100644
index d43801b..0000000
--- a/karaf/assembly/pom.xml
+++ /dev/null
@@ -1,505 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf</groupId>
-    <artifactId>apache-felix-karaf</artifactId>
-    <packaging>pom</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Assembly</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix.karaf</groupId>
-            <artifactId>manual</artifactId>
-            <type>pdf</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf</groupId>
-            <artifactId>manual</artifactId>
-            <type>html</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf</groupId>
-            <artifactId>org.apache.felix.karaf.main</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf</groupId>
-            <artifactId>org.apache.felix.karaf.exception</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf</groupId>
-            <artifactId>org.apache.felix.karaf.client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.deployer</groupId>
-            <artifactId>org.apache.felix.karaf.deployer.spring</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.deployer</groupId>
-            <artifactId>org.apache.felix.karaf.deployer.blueprint</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.deployer</groupId>
-            <artifactId>org.apache.felix.karaf.deployer.features</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.deployer</groupId>
-            <artifactId>org.apache.felix.karaf.deployer.war</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.features</groupId>
-            <artifactId>org.apache.felix.karaf.features.core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.features</groupId>
-            <artifactId>org.apache.felix.karaf.features.command</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.features</groupId>
-            <artifactId>org.apache.felix.karaf.features.management</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.admin</groupId>
-            <artifactId>org.apache.felix.karaf.admin.core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.admin</groupId>
-            <artifactId>org.apache.felix.karaf.admin.command</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.admin</groupId>
-            <artifactId>org.apache.felix.karaf.admin.management</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.obr</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.osgi</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.log</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.config</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.packages</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.commands</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.ssh</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.dev</artifactId>
-        </dependency>      
-        <dependency>
-            <groupId>org.apache.felix.karaf.jaas</groupId>
-            <artifactId>org.apache.felix.karaf.jaas.boot</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.jaas</groupId>
-            <artifactId>org.apache.felix.karaf.jaas.config</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.jaas</groupId>
-            <artifactId>org.apache.felix.karaf.jaas.modules</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf</groupId>
-            <artifactId>org.apache.felix.karaf.management</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>jline</groupId>
-            <artifactId>jline</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</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.metatype</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.prefs</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.logging</groupId>
-            <artifactId>pax-logging-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.logging</groupId>
-            <artifactId>pax-logging-service</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.url</groupId>
-            <artifactId>pax-url-mvn</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.url</groupId>
-            <artifactId>pax-url-wrap</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sshd</groupId>
-            <artifactId>sshd-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse</groupId>
-            <artifactId>osgi</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.framework</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.jmx</groupId>
-            <artifactId>org.apache.aries.jmx</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.jmx</groupId>
-            <artifactId>org.apache.aries.jmx.blueprint</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-servlet_2.5_spec</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.jetty-bundle</artifactId>
-            <optional>true</optional>
-        </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>
-    </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.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.felix.karaf</groupId>
-                                    <artifactId>org.apache.felix.karaf.main</artifactId>
-                                    <outputDirectory>target/dependencies/lib</outputDirectory>
-                                    <destFileName>karaf.jar</destFileName>
-                                </artifactItem>
-                                <artifactItem>
-                                    <groupId>org.apache.felix.karaf</groupId>
-                                    <artifactId>org.apache.felix.karaf.client</artifactId>
-                                    <outputDirectory>target/dependencies/lib</outputDirectory>
-                                    <destFileName>karaf-client.jar</destFileName>
-                                </artifactItem>
-                                <artifactItem>
-                                    <groupId>org.apache.felix.karaf.jaas</groupId>
-                                    <artifactId>org.apache.felix.karaf.jaas.boot</artifactId>
-                                    <outputDirectory>target/dependencies/lib</outputDirectory>
-                                    <destFileName>karaf-jaas-boot.jar</destFileName>
-                                </artifactItem>
-                                <artifactItem>
-                                    <groupId>org.apache.felix.karaf</groupId>
-                                    <artifactId>manual</artifactId>
-                                    <type>pdf</type>
-                                    <outputDirectory>target/dependencies</outputDirectory>
-                                    <destFileName>karaf-manual-${project.version}.pdf</destFileName>
-                                </artifactItem>
-                                <artifactItem>
-                                    <groupId>org.apache.felix.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>
-            <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>
-            <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-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>
-                        </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>true</appendAssemblyId>
-                            <assemblyId />
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>unix-src</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <descriptors>
-                                <descriptor>src/main/descriptors/unix-src.xml</descriptor>
-                            </descriptors>
-                            <tarLongFileMode>gnu</tarLongFileMode>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>windows-src</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <descriptors>
-                                <descriptor>src/main/descriptors/windows-src.xml</descriptor>
-                            </descriptors>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>assembly-src</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-assembly-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unix-src</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>attached</goal>
-                                </goals>
-                                <configuration>
-                                    <descriptors>
-                                        <descriptor>src/main/descriptors/unix-src.xml</descriptor>
-                                    </descriptors>
-                                </configuration>
-                            </execution>
-                            <execution>
-                                <id>windows-src</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>attached</goal>
-                                </goals>
-                                <configuration>
-                                    <descriptors>
-                                        <descriptor>src/main/descriptors/windows-src.xml</descriptor>
-                                    </descriptors>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>
diff --git a/karaf/assembly/src/main/descriptors/unix-bin.xml b/karaf/assembly/src/main/descriptors/unix-bin.xml
deleted file mode 100644
index fb3fead..0000000
--- a/karaf/assembly/src/main/descriptors/unix-bin.xml
+++ /dev/null
@@ -1,298 +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></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>
-            </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>
-            <outputDirectory>/etc/</outputDirectory>
-            <lineEnding>unix</lineEnding>
-        </fileSet>
-
-        <!-- Copy over the examples -->
-        <fileSet>
-            <directory>target/classes/demos</directory>
-            <outputDirectory>/demos/</outputDirectory>
-            <lineEnding>unix</lineEnding>
-        </fileSet>
-        <fileSet>
-            <directory>../demos</directory>
-            <outputDirectory>/demos/</outputDirectory>
-            <lineEnding>unix</lineEnding>
-            <excludes>
-                <exclude>**/target/**</exclude>
-            </excludes>
-        </fileSet>
-
-        <!-- Copy over files that should not get the line endings converted -->
-        <fileSet>
-            <directory>src/main/distribution/binary</directory>
-            <outputDirectory>/</outputDirectory>
-        </fileSet>
-
-        <!-- Copy over the files that should not get the line endings converted but need to be chmod to 755 -->
-        <fileSet>
-            <directory>src/main/distribution/unix-binary</directory>
-            <outputDirectory>/</outputDirectory>
-            <fileMode>0755</fileMode>
-        </fileSet>
-        
-        <!-- Copy over the files that need unix line endings and also chmod to 755 -->
-        <fileSet>
-            <directory>src/main/distribution/unix-shell</directory>
-            <outputDirectory>/</outputDirectory>
-            <lineEnding>unix</lineEnding>
-            <fileMode>0755</fileMode>
-        </fileSet>
-
-        <!-- Copy over jar files -->
-        <fileSet>
-            <directory>target/dependencies</directory>
-            <outputDirectory>/</outputDirectory>
-        </fileSet>
-
-    </fileSets>
-
-    <files>
-        <file>
-            <source>${basedir}/../LICENSE</source>
-            <outputDirectory>/</outputDirectory>
-            <destName>LICENSE</destName>
-            <fileMode>0644</fileMode>
-            <lineEnding>unix</lineEnding>
-        </file>
-        <file>
-            <source>${basedir}/NOTICE</source>
-            <outputDirectory>/</outputDirectory>
-            <destName>NOTICE</destName>
-            <fileMode>0644</fileMode>
-            <lineEnding>unix</lineEnding>
-        </file>
-        <file>
-            <source>${basedir}/target/classes/features.xml</source>
-            <outputDirectory>/system/org/apache/felix/karaf/apache-felix-karaf/${project.version}</outputDirectory>
-            <destName>apache-felix-karaf-${project.version}-features.xml</destName>
-            <fileMode>0644</fileMode>
-            <lineEnding>unix</lineEnding>
-        </file>
-    </files>
-
-    <dependencySets>
-        <dependencySet>
-            <outputDirectory>/lib/endorsed</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <includes>
-                <include>org.apache.felix.karaf:org.apache.felix.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.prefs</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/apache/felix/gogo/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.gogo:org.apache.felix.gogo.runtime</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/felix/karaf/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf:org.apache.felix.karaf.management</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/felix/karaf/features/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf.features:org.apache.felix.karaf.features.core</include>
-                <include>org.apache.felix.karaf.features:org.apache.felix.karaf.features.command</include>
-                <include>org.apache.felix.karaf.features:org.apache.felix.karaf.features.management</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/felix/karaf/admin/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.core</include>
-                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.command</include>
-                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.management</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/felix/karaf/deployer/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf.deployer:org.apache.felix.karaf.deployer.spring</include>
-                <include>org.apache.felix.karaf.deployer:org.apache.felix.karaf.deployer.blueprint</include>
-                <include>org.apache.felix.karaf.deployer:org.apache.felix.karaf.deployer.features</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/felix/karaf/shell/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.console</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.dev</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.osgi</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.log</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.config</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.packages</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.ssh</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.commands</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/felix/karaf/jaas/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf.jaas:org.apache.felix.karaf.jaas.config</include>
-                <include>org.apache.felix.karaf.jaas:org.apache.felix.karaf.jaas.modules</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/sshd/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.sshd:sshd-core</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/mina/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.mina:mina-core</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/eclipse/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.eclipse:osgi</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/aries/blueprint/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.aries.blueprint:org.apache.aries.blueprint</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/aries/jmx/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.aries.jmx:org.apache.aries.jmx</include>
-                <include>org.apache.aries.jmx:org.apache.aries.jmx.blueprint</include>
-            </includes>
-        </dependencySet>
-
-    </dependencySets>
-
-</assembly>
diff --git a/karaf/assembly/src/main/descriptors/unix-src.xml b/karaf/assembly/src/main/descriptors/unix-src.xml
deleted file mode 100644
index 121e36a..0000000
--- a/karaf/assembly/src/main/descriptors/unix-src.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.
--->
-<assembly>
-    <id>src</id>
-    <formats>
-        <format>tar.gz</format>
-    </formats>
-    <fileSets>
-        <!-- Copy license and other files from root -->
-        <fileSet>
-            <directory>${basedir}/..</directory>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>BUILDING</include>
-                <include>README</include>
-                <include>NOTICE</include>
-                <include>LICENSE</include>
-                <include>RELEASE*</include>
-            </includes>
-            <lineEnding>unix</lineEnding>
-        </fileSet>
-
-        <!-- Binary Files -->
-        <fileSet>
-            <directory>${basedir}/..</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>apache-felix-karaf/src/main/release/bin/*/wrapper</include>
-            </includes>
-            <excludes>
-                <exclude>**/eclipse-classes/**</exclude>
-                <exclude>**/target/**</exclude>
-            </excludes>
-        </fileSet>
-
-        <!-- Text Files -->
-        <fileSet>
-            <directory>${basedir}/..</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-felix-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/assembly/src/main/descriptors/windows-bin.xml b/karaf/assembly/src/main/descriptors/windows-bin.xml
deleted file mode 100644
index 3b03a21..0000000
--- a/karaf/assembly/src/main/descriptors/windows-bin.xml
+++ /dev/null
@@ -1,290 +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></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>
-          </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>
-          <outputDirectory>/etc/</outputDirectory>
-          <lineEnding>dos</lineEnding>
-      </fileSet>
-
-        <!-- Copy over the examples -->
-        <fileSet>
-            <directory>target/classes/demos</directory>
-            <outputDirectory>/demos/</outputDirectory>
-            <lineEnding>dos</lineEnding>
-        </fileSet>
-
-        <fileSet>
-            <directory>../demos</directory>
-            <outputDirectory>/demos/</outputDirectory>
-            <lineEnding>dos</lineEnding>
-            <excludes>
-                <exclude>**/target/**</exclude>
-            </excludes>
-        </fileSet>
-
-      <!-- Copy over files that should not get the line endings converted -->
-      <fileSet>
-          <directory>src/main/distribution/binary</directory>
-          <outputDirectory>/</outputDirectory>
-      </fileSet>
-
-      <!-- Copy over the files that should not get the line endings converted but need to be chmod to 755 -->
-      <fileSet>
-          <directory>src/main/distribution/windows-binary</directory>
-          <outputDirectory>/</outputDirectory>
-      </fileSet>
-      
-      <!-- Copy over jar files -->
-      <fileSet>
-          <directory>target/dependencies</directory>
-          <outputDirectory>/</outputDirectory>
-      </fileSet>
-
-    </fileSets>
-
-    <files>
-        <file>
-            <source>${basedir}/../LICENSE</source>
-            <outputDirectory>/</outputDirectory>
-            <destName>LICENSE</destName>
-            <fileMode>0644</fileMode>
-            <lineEnding>dos</lineEnding>
-        </file>
-        <file>
-            <source>${basedir}/NOTICE</source>
-            <outputDirectory>/</outputDirectory>
-            <destName>NOTICE</destName>
-            <fileMode>0644</fileMode>
-            <lineEnding>dos</lineEnding>
-        </file>
-        <file>
-            <source>${basedir}/target/classes/features.xml</source>
-            <outputDirectory>/system/org/apache/felix/karaf/apache-felix-karaf/${project.version}</outputDirectory>
-            <destName>apache-felix-karaf-${project.version}-features.xml</destName>
-            <fileMode>0644</fileMode>
-            <lineEnding>dos</lineEnding>
-        </file>
-    </files>
-
-    <dependencySets>
-        <dependencySet>
-            <outputDirectory>/lib/endorsed</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <includes>
-                <include>org.apache.felix.karaf:org.apache.felix.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.prefs</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/apache/felix/gogo/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.gogo:org.apache.felix.gogo.runtime</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/felix/karaf/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf:org.apache.felix.karaf.management</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/felix/karaf/features/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf.features:org.apache.felix.karaf.features.core</include>
-                <include>org.apache.felix.karaf.features:org.apache.felix.karaf.features.command</include>
-                <include>org.apache.felix.karaf.features:org.apache.felix.karaf.features.management</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/felix/karaf/admin/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.core</include>
-                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.command</include>
-                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.management</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/felix/karaf/deployer/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf.deployer:org.apache.felix.karaf.deployer.spring</include>
-                <include>org.apache.felix.karaf.deployer:org.apache.felix.karaf.deployer.blueprint</include>
-                <include>org.apache.felix.karaf.deployer:org.apache.felix.karaf.deployer.features</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/felix/karaf/shell/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.console</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.dev</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.osgi</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.log</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.config</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.packages</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.ssh</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.commands</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/felix/karaf/jaas/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.felix.karaf.jaas:org.apache.felix.karaf.jaas.config</include>
-                <include>org.apache.felix.karaf.jaas:org.apache.felix.karaf.jaas.modules</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/sshd/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.sshd:sshd-core</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/mina/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.mina:mina-core</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/eclipse/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.eclipse:osgi</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/aries/blueprint/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.aries.blueprint:org.apache.aries.blueprint</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputFileNameMapping>org/apache/aries/jmx/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.aries.jmx:org.apache.aries.jmx</include>
-                <include>org.apache.aries.jmx:org.apache.aries.jmx.blueprint</include>
-            </includes>
-        </dependencySet>
-
-    </dependencySets>
-
-</assembly>
diff --git a/karaf/assembly/src/main/descriptors/windows-src.xml b/karaf/assembly/src/main/descriptors/windows-src.xml
deleted file mode 100644
index d038b9b..0000000
--- a/karaf/assembly/src/main/descriptors/windows-src.xml
+++ /dev/null
@@ -1,110 +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 license and other files from root -->
-        <fileSet>
-            <directory>${basedir}/..</directory>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>BUILDING</include>
-                <include>README</include>
-                <include>NOTICE</include>
-                <include>LICENSE</include>
-                <include>RELEASE*</include>
-            </includes>
-            <lineEnding>dos</lineEnding>
-        </fileSet>
-
-        <!-- Binary Files -->
-        <fileSet>
-            <directory>${basedir}/..</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>apache-felix-karaf/src/main/release/bin/*/wrapper</include>
-            </includes>
-            <excludes>
-                <exclude>**/eclipse-classes/**</exclude>
-                <exclude>**/target/**</exclude>
-            </excludes>
-        </fileSet>
-
-        <!-- Text Files -->
-        <fileSet>
-            <directory>${basedir}/..</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-felix-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/assembly/src/main/distribution/text/deploy/README b/karaf/assembly/src/main/distribution/text/deploy/README
deleted file mode 100644
index 796bd5b..0000000
--- a/karaf/assembly/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.
\ No newline at end of file
diff --git a/karaf/assembly/src/main/distribution/text/etc/java.util.logging.properties b/karaf/assembly/src/main/distribution/text/etc/java.util.logging.properties
deleted file mode 100644
index b7b50c5..0000000
--- a/karaf/assembly/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/assembly/src/main/distribution/text/etc/org.apache.felix.fileinstall-deploy.cfg b/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.fileinstall-deploy.cfg
deleted file mode 100644
index 62330b9..0000000
--- a/karaf/assembly/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.base}/data/generated-bundles
-felix.fileinstall.poll    = 1000
diff --git a/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.log.cfg b/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.log.cfg
deleted file mode 100644
index 39437d0..0000000
--- a/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.log.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.
-#
-################################################################################
-
-#
-size = 500
-pattern = %d{ABSOLUTE} | %-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/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.management.cfg b/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.management.cfg
deleted file mode 100644
index a44e524..0000000
--- a/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.management.cfg
+++ /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.
-#
-################################################################################
-
-#
-rmiRegistryPort = 1099
-jmxRealm = karaf
-serviceUrl = service:jmx:rmi:///jndi/rmi://localhost:${rmiRegistryPort}/karaf-${karaf.name}
-daemon = true
-threaded = true
-objectName = connector:name=rmi
diff --git a/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.shell.cfg b/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.shell.cfg
deleted file mode 100644
index 555d451..0000000
--- a/karaf/assembly/src/main/distribution/text/etc/org.apache.felix.karaf.shell.cfg
+++ /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.
-#
-################################################################################
-
-#
-sshPort=8101
-sshHost=0.0.0.0
-sshRealm=karaf
-hostKey=${karaf.base}/etc/host.key
diff --git a/karaf/assembly/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg b/karaf/assembly/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg
deleted file mode 100644
index 7c1f73d..0000000
--- a/karaf/assembly/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg
+++ /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.
-#
-################################################################################
-
-# 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{1} | %-32.32C %4L | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %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 | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
-log4j.appender.out.file=${karaf.base}/data/log/karaf.log
-log4j.appender.out.append=true
-
-# 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{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
-log4j.appender.sift.appender.file=${karaf.base}/data/log/$\\{bundle.name\\}.log
-log4j.appender.sift.appender.append=true
-
diff --git a/karaf/assembly/src/main/distribution/text/etc/org.ops4j.pax.url.mvn.cfg b/karaf/assembly/src/main/distribution/text/etc/org.ops4j.pax.url.mvn.cfg
deleted file mode 100644
index 8e0e435..0000000
--- a/karaf/assembly/src/main/distribution/text/etc/org.ops4j.pax.url.mvn.cfg
+++ /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.
-#
-################################################################################
-
-#
-# If set to true, the following property will not allow any certificate to be used
-# when accessing maven repositories through SSL
-#
-#org.ops4j.pax.url.mvn.certificateCheck=
-
-#
-# Path to the local maven settings file.
-# The repositories defined in this file will be automatically added to the list
-# of default repositories if the 'org.ops4j.pax.url.mvn.repositories' property
-# below is not set.
-# The following locations are checked for the existence of the settings.xml file
-#   * 1. looks for the specified url
-#   * 2. if not found looks for ${user.home}/.m2/settings.xml
-#   * 3. if not found looks for ${maven.home}/conf/settings.xml
-#   * 4. if not found looks for ${M2_HOME}/conf/settings.xml
-#
-#org.ops4j.pax.url.mvn.settings=
-
-#
-# Path to the local maven repository which is used to avoid downloading
-# artifacts when they already exist locally.
-# The value of this property will be extracted from the settings.xml file
-# above, or defaulted to:
-#     System.getProperty( "user.home" ) + "/.m2/repository"
-#
-#org.ops4j.pax.url.mvn.localRepository=
-
-#
-# Comma separated list of repositories scanned when resolving an artifact.
-# Those repositories will be checked before iterating through the
-#    below list of repositories and even before the local repository
-# A repository url can be appended with zero or more of the following flags:
-#    @snapshots  : the repository contains snaphots
-#    @noreleases : the repository does not contain any released artifacts
-#
-# The following property value will add the system folder as a repo.
-#
-org.ops4j.pax.url.mvn.defaultRepositories=file:${karaf.home}/${karaf.default.repository}@snapshots
-
-#
-# Comma separated list of repositories scanned when resolving an artifact.
-# The default list includes the following repositories:
-#    http://repo1.maven.org/maven2
-#    http://repository.ops4j.org/maven2
-# To add repositories to the default ones, prepend '+' to the list of repositories
-# to add.
-# A repository url can be appended with zero or more of the following flags:
-#    @snapshots  : the repository contains snaphots
-#    @noreleases : the repository does not contain any released artifacts
-#
-# The following property value will add the system folder as a repo.
-#
-org.ops4j.pax.url.mvn.repositories= \
-    http://repo1.maven.org/maven2, \
-    http://repository.apache.org/content/groups/snapshots-group@snapshots@noreleases, \
-    http://repository.ops4j.org/maven2, \
-    http://svn.apache.org/repos/asf/servicemix/m2-repo, \
-    http://repository.springsource.com/maven/bundles/release, \
-    http://repository.springsource.com/maven/bundles/external
diff --git a/karaf/assembly/src/main/distribution/text/etc/shell.init.script b/karaf/assembly/src/main/distribution/text/etc/shell.init.script
deleted file mode 100644
index b58d16d..0000000
--- a/karaf/assembly/src/main/distribution/text/etc/shell.init.script
+++ /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.
-//
-// 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 } ;
diff --git a/karaf/assembly/src/main/distribution/text/etc/system.properties b/karaf/assembly/src/main/distribution/text/etc/system.properties
deleted file mode 100644
index 8c624a5..0000000
--- a/karaf/assembly/src/main/distribution/text/etc/system.properties
+++ /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.
-#
-################################################################################
-
-#
-# 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
-
-#
-# Set this empty property to avoid errors when validating xml documents.
-#
-xml.catalog.files=
-
-#
-# Suppress the bell in the console when hitting backspace to many times
-# for example
-#
-jline.nobell=true
diff --git a/karaf/assembly/src/main/distribution/text/etc/users.properties b/karaf/assembly/src/main/distribution/text/etc/users.properties
deleted file mode 100644
index b91ac84..0000000
--- a/karaf/assembly/src/main/distribution/text/etc/users.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.
-#
-################################################################################
-
-#
-karaf=karaf,admin
diff --git a/karaf/assembly/src/main/distribution/text/lib/README b/karaf/assembly/src/main/distribution/text/lib/README
deleted file mode 100644
index ab4868d..0000000
--- a/karaf/assembly/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 this jar won't be available to other bundles
-unless one of the org.osgi.framework.system.packages.extra or
-org.osgi.framework.bootdelegation property in the etc/config.properties file
-is modified to export or delegate the packages.
-Please refer to the OSGi Core Specification for more informations on those
-properties and the OSGi classloading mechanism.
\ No newline at end of file
diff --git a/karaf/assembly/src/main/distribution/text/lib/endorsed/README b/karaf/assembly/src/main/distribution/text/lib/endorsed/README
deleted file mode 100644
index 81acbae1..0000000
--- a/karaf/assembly/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 informations, see:
-   http://java.sun.com/j2se/1.5.0/docs/guide/standards/
\ No newline at end of file
diff --git a/karaf/assembly/src/main/distribution/text/lib/ext/README b/karaf/assembly/src/main/distribution/text/lib/ext/README
deleted file mode 100644
index 26e2f3e..0000000
--- a/karaf/assembly/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 informations, see
-   http://java.sun.com/j2se/1.5.0/docs/guide/extensions/spec.html
\ No newline at end of file
diff --git a/karaf/assembly/src/main/distribution/unix-shell/bin/karaf b/karaf/assembly/src/main/distribution/unix-shell/bin/karaf
deleted file mode 100755
index f990e2e..0000000
--- a/karaf/assembly/src/main/distribution/unix-shell/bin/karaf
+++ /dev/null
@@ -1,326 +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.
-#
-# $Id: karaf 979 2005-11-30 22:50:55Z bsnyder $
-#
-
-DIRNAME=`dirname $0`
-PROGNAME=`basename $0`
-
-#
-# 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
-}
-
-maybeSource() {
-    file="$1"
-    if [ -f "$file" ] ; then
-        . $file
-    fi
-}
-
-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
-}
-
-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
-}
-
-pathCanonicalSimple() {
-	local dst="${1}"
-	cd -P -- "$(dirname -- "${dst}")" &> /dev/null && echo "$(pwd -P)/$(basename -- "${dst}")"
-}
-
-pathCanonical() {
-	local dst=`pathCanonicalSimple "${1}"`
-	while [ -h "${dst}" ]; do
-		local linkDst="$(ls -l "${dst}" | sed -e 's/^.*[[:space:]]*->[[:space:]]*\(.*\)[[:space:]]*$/\1/g')"
-		if [ -z "$(echo "${linkDst}" | grep -E '^/')" ]; then
-			# relative link destination
-			linkDst="$(dirname "${dst}")/${linkDst}"
-		fi
-		dst=`pathCanonicalSimple "${linkDst}"`
-	done
-	echo "${dst}"
-}
-
-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" ]; 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=`which java`
-            if [ "x$JAVA" = "x" ]; then
-                die "java command not found"
-            fi
-        fi
-    fi
-    if [ "x$JAVA_HOME" = "x" ]; then
-        JAVA_HOME=$(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
-        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
-
-    # 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.felix.karaf.main.Main
-    case "$1" in
-        'stop')
-            MAIN=org.apache.felix.karaf.main.Stop
-            shift
-            ;;
-        'console')
-            shift
-            ;;
-        'server')
-            OPTS="-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true"
-            shift
-            ;;
-        'client')
-            OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=false"
-            shift
-            ;;
-    esac
-
-    if $cygwin; then
-        KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
-        KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
-        CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
-    fi
-    cd $KARAF_BASE
-    exec $JAVA $JAVA_OPTS -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" -Dstorage.location="${KARAF_HOME}/instances" -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $OPTS -classpath "$CLASSPATH" $MAIN "$@"
-}
-
-main() {
-    init
-    run "$@"
-}
-
-main "$@"
diff --git a/karaf/assembly/src/main/distribution/unix-shell/bin/start b/karaf/assembly/src/main/distribution/unix-shell/bin/start
deleted file mode 100755
index 474885e..0000000
--- a/karaf/assembly/src/main/distribution/unix-shell/bin/start
+++ /dev/null
@@ -1,115 +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.
-#
-# $Id: karaf 979 2005-11-30 22:50:55Z bsnyder $
-#
-
-DIRNAME=`dirname $0`
-PROGNAME=`basename $0`
-
-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
-}
-
-init() {
-    # Determine if there is special OS handling we must perform
-    detectOS
-
-    # Locate the Karaf home directory
-    locateHome
-
-    # Locate the Karaf base directory
-    locateBase
-}
-
-run() {
-    if $cygwin; then
-        KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
-        KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
-        CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
-    fi
-    # Ensure the log directory exists -- we need to have a place to redirect stdout/stderr
-    if [ ! -d "$KARAF_HOME/data/log" ]; then
-        mkdir -p "$KARAF_HOME/data/log"
-    fi
-    exec "$KARAF_HOME"/bin/karaf server "$@" >> "$KARAF_HOME/data/log/karaf.out" 2>&1 &
-}
-
-main() {
-    init
-    run "$@"
-}
-
-main "$@"
-
diff --git a/karaf/assembly/src/main/distribution/unix-shell/bin/stop b/karaf/assembly/src/main/distribution/unix-shell/bin/stop
deleted file mode 100755
index dd6dfc2..0000000
--- a/karaf/assembly/src/main/distribution/unix-shell/bin/stop
+++ /dev/null
@@ -1,115 +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.
-#
-# $Id: karaf 979 2005-11-30 22:50:55Z bsnyder $
-#
-
-DIRNAME=`dirname $0`
-PROGNAME=`basename $0`
-
-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
-}
-
-init() {
-    # Determine if there is special OS handling we must perform
-    detectOS
-
-    # Locate the Karaf home directory
-    locateHome
-
-    # Locate the Karaf base directory
-    locateBase
-}
-
-run() {
-    if $cygwin; then
-        KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
-        KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
-        CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
-    fi
-    # Ensure the log directory exists -- we need to have a place to redirect stdout/stderr
-    if [ ! -d "$KARAF_HOME/data/log" ]; then
-        mkdir -p "$KARAF_HOME/data/log"
-    fi
-    exec "$KARAF_HOME"/bin/karaf stop "$@"
-}
-
-main() {
-    init
-    run "$@"
-}
-
-main "$@"
-
diff --git a/karaf/assembly/src/main/distribution/windows-text/bin/karaf.bat b/karaf/assembly/src/main/distribution/windows-text/bin/karaf.bat
deleted file mode 100755
index 40ce239..0000000
--- a/karaf/assembly/src/main/distribution/windows-text/bin/karaf.bat
+++ /dev/null
@@ -1,242 +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 $Id: karaf.bat 979 2005-11-30 22:50:55Z bsnyder $
-rem
-
-if not "%ECHO%" == "" echo %ECHO%
-
-setlocal
-set DIRNAME=%~dp0%
-set PROGNAME=%~nx0%
-set ARGS=%*
-
-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%
-)
-
-set LOCAL_CLASSPATH=%CLASSPATH%
-set DEFAULT_JAVA_OPTS=-server -Xmx512M -Dderby.system.home="%KARAF_BASE%\data\derby" -Dderby.storage.fileSyncTransactionLog=true -Dcom.sun.management.jmxremote
-set CLASSPATH=%LOCAL_CLASSPATH%;%KARAF_BASE%\conf
-set DEFAULT_JAVA_DEBUG_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
-
-if "%LOCAL_CLASSPATH%" == "" goto :KARAF_CLASSPATH_EMPTY
-    set CLASSPATH=%LOCAL_CLASSPATH%;%KARAF_BASE%\conf
-    goto :KARAF_CLASSPATH_END
-:KARAF_CLASSPATH_EMPTY
-    set CLASSPATH=%KARAF_BASE%\conf
-:KARAF_CLASSPATH_END
-
-rem Setup Karaf Home
-if exist "%KARAF_HOME%\conf\karaf-rc.cmd" call %KARAF_HOME%\conf\karaf-rc.cmd
-if exist "%HOME%\karaf-rc.cmd" call %HOME%\karaf-rc.cmd
-
-rem Support for loading native libraries
-set PATH=%PATH%;%KARAF_BASE%\lib;%KARAF_HOME%\lib
-
-rem Setup the Java Virtual Machine
-if not "%JAVA%" == "" goto :Check_JAVA_END
-    if not "%JAVA_HOME%" == "" goto :TryJDKEnd
-        call :warn JAVA_HOME not set; results may vary
-:TryJRE
-    start /w regedit /e __reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment"
-    if not exist __reg1.txt goto :TryJDK
-    type __reg1.txt | find "CurrentVersion" > __reg2.txt
-    if errorlevel 1 goto :TryJDK
-    for /f "tokens=2 delims==" %%x in (__reg2.txt) do set JavaTemp=%%~x
-    if errorlevel 1 goto :TryJDK
-    set JavaTemp=%JavaTemp%##
-    set JavaTemp=%JavaTemp:                ##=##%
-    set JavaTemp=%JavaTemp:        ##=##%
-    set JavaTemp=%JavaTemp:    ##=##%
-    set JavaTemp=%JavaTemp:  ##=##%
-    set JavaTemp=%JavaTemp: ##=##%
-    set JavaTemp=%JavaTemp:##=%
-    del __reg1.txt
-    del __reg2.txt
-    start /w regedit /e __reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\%JavaTemp%"
-    if not exist __reg1.txt goto :TryJDK
-    type __reg1.txt | find "JavaHome" > __reg2.txt
-    if errorlevel 1 goto :TryJDK
-    for /f "tokens=2 delims==" %%x in (__reg2.txt) do set JAVA_HOME=%%~x
-    if errorlevel 1 goto :TryJDK
-    del __reg1.txt
-    del __reg2.txt
-    goto TryJDKEnd
-:TryJDK
-    start /w regedit /e __reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit"
-    if not exist __reg1.txt (
-        call :warn Unable to retrieve JAVA_HOME
-        goto END
-    )
-    type __reg1.txt | find "CurrentVersion" > __reg2.txt
-    if errorlevel 1 (
-        call :warn Unable to retrieve JAVA_HOME
-        goto END
-    )
-    for /f "tokens=2 delims==" %%x in (__reg2.txt) do set JavaTemp=%%~x
-    if errorlevel 1 (
-        call :warn Unable to retrieve JAVA_HOME
-        goto END
-    )
-    set JavaTemp=%JavaTemp%##
-    set JavaTemp=%JavaTemp:                ##=##%
-    set JavaTemp=%JavaTemp:        ##=##%
-    set JavaTemp=%JavaTemp:    ##=##%
-    set JavaTemp=%JavaTemp:  ##=##%
-    set JavaTemp=%JavaTemp: ##=##%
-    set JavaTemp=%JavaTemp:##=%
-    del __reg1.txt
-    del __reg2.txt
-    start /w regedit /e __reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\%JavaTemp%"
-    if not exist __reg1.txt (
-        call :warn Unable to retrieve JAVA_HOME from JDK
-        goto END
-    )
-    type __reg1.txt | find "JavaHome" > __reg2.txt
-    if errorlevel 1 (
-        call :warn Unable to retrieve JAVA_HOME
-        goto END
-    )
-    for /f "tokens=2 delims==" %%x in (__reg2.txt) do set JAVA_HOME=%%~x
-    if errorlevel 1 (
-        call :warn Unable to retrieve JAVA_HOME
-        goto END
-    )
-    del __reg1.txt
-    del __reg2.txt
-:TryJDKEnd
-    if not exist "%JAVA_HOME%" (
-        call :warn JAVA_HOME is not valid: "%JAVA_HOME%"
-        goto END
-    )
-    set JAVA=%JAVA_HOME%\bin\java
-:Check_JAVA_END
-
-if "%JAVA_OPTS%" == "" set JAVA_OPTS=%DEFAULT_JAVA_OPTS%
-
-if "%KARAF_DEBUG%" == "" goto :KARAF_DEBUG_END
-    rem Use the defaults if JAVA_DEBUG_OPTS was not set
-    if "%JAVA_DEBUG_OPTS%" == "" set JAVA_DEBUG_OPTS=%DEFAULT_JAVA_DEBUG_OPTS%
-
-    set "JAVA_OPTS=%JAVA_DEBUG_OPTS% %JAVA_OPTS%"
-    call :warn Enabling Java debug options: %JAVA_DEBUG_OPTS%
-:KARAF_DEBUG_END
-
-if "%KARAF_PROFILER%" == "" goto :KARAF_PROFILER_END
-    set KARAF_PROFILER_SCRIPT=%KARAF_HOME%\conf\profiler\%KARAF_PROFILER%.cmd
-
-    if exist "%KARAF_PROFILER_SCRIPT%" goto :KARAF_PROFILER_END
-    call :warn Missing configuration for profiler '%KARAF_PROFILER%': %KARAF_PROFILER_SCRIPT%
-    goto END
-:KARAF_PROFILER_END
-
-rem Setup the classpath
-pushd "%KARAF_HOME%\lib"
-for %%G in (*.*) 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.felix.karaf.main.Main
-    SET SHIFT=false
-    if "%1" == "stop" goto :EXECUTE_STOP
-    if "%1" == "console" goto :EXECUTE_CONSOLE
-    if "%1" == "server" goto :EXECUTE_SERVER
-    if "%1" == "client" goto :EXECUTE_CLIENT
-    goto :EXECUTE
-
-:EXECUTE_STOP
-    SET MAIN=org.apache.felix.karaf.main.Stop
-    SET SHIFT=true
-    goto :EXECUTE
-
-:EXECUTE_CONSOLE
-    SET SHIFT=true
-    goto :EXECUTE
-
-:EXECUTE_SERVER
-    SET OPTS=-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true
-    SET SHIFT=true
-    goto :EXECUTE
-
-:EXECUTE_CLIENT
-    SET OPTS=-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=false
-    SET SHIFT=true
-    goto :EXECUTE
-
-: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
-    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" -Dstorage.location="%KARAF_HOME%\instances" -Dkaraf.home="%KARAF_HOME%" -Dkaraf.base="%KARAF_BASE%" -Djava.util.logging.config.file="%KARAF_BASE%\etc\java.util.logging.properties" %MAIN% %ARGS%
-
-rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
-
-:END
-
-endlocal
-
-if not "%PAUSE%" == "" pause
-
-:END_NO_PAUSE
-
diff --git a/karaf/assembly/src/main/distribution/windows-text/bin/start.bat b/karaf/assembly/src/main/distribution/windows-text/bin/start.bat
deleted file mode 100755
index 1db948b..0000000
--- a/karaf/assembly/src/main/distribution/windows-text/bin/start.bat
+++ /dev/null
@@ -1,72 +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 $Id: karaf.bat 979 2005-11-30 22:50:55Z bsnyder $
-rem 
-
-if not "%ECHO%" == "" echo %ECHO%
-
-setlocal
-set DIRNAME=%~dp0%
-set PROGNAME=%~nx0%
-set ARGS=%*
-
-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
\ No newline at end of file
diff --git a/karaf/assembly/src/main/distribution/windows-text/bin/stop.bat b/karaf/assembly/src/main/distribution/windows-text/bin/stop.bat
deleted file mode 100755
index 3b875cd..0000000
--- a/karaf/assembly/src/main/distribution/windows-text/bin/stop.bat
+++ /dev/null
@@ -1,72 +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 $Id: karaf.bat 979 2005-11-30 22:50:55Z bsnyder $
-rem
-
-if not "%ECHO%" == "" echo %ECHO%
-
-setlocal
-set DIRNAME=%~dp0%
-set PROGNAME=%~nx0%
-set ARGS=%*
-
-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
\ No newline at end of file
diff --git a/karaf/assembly/src/main/filtered-resources/bin/admin b/karaf/assembly/src/main/filtered-resources/bin/admin
deleted file mode 100644
index 96a6e0d..0000000
--- a/karaf/assembly/src/main/filtered-resources/bin/admin
+++ /dev/null
@@ -1,284 +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`
-
-#
-# 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
-}
-
-maybeSource() {
-    file="$1"
-    if [ -f "$file" ] ; then
-        . $file
-    fi
-}
-
-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
-}
-
-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
-}
-
-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" = "x" ]; then
-        if [ "x$JAVA_HOME" = "x" ] && [ "$darwin" = "true" ]; then
-            JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
-        fi
-        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="java"
-        fi
-    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
-        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
-
-    # 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
-
-    CLASSPATH=${KARAF_HOME}/system/org/apache/felix/karaf/admin/org.apache.felix.karaf.admin.command/${project.version}/org.apache.felix.karaf.admin.command-${project.version}.jar:${KARAF_HOME}/system/org/apache/felix/karaf/admin/org.apache.felix.karaf.admin.core/${project.version}/org.apache.felix.karaf.admin.core-${project.version}.jar:${KARAF_HOME}/system/org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.console/${project.version}/org.apache.felix.karaf.shell.console-${project.version}.jar:${KARAF_HOME}/system/org/apache/felix/gogo/org.apache.felix.gogo.runtime/${felix.gogo.version}/org.apache.felix.gogo.runtime-${felix.gogo.version}.jar:${KARAF_HOME}/system/org/apache/aries/blueprint/org.apache.aries.blueprint/${aries.blueprint.version}/org.apache.aries.blueprint-${aries.blueprint.version}.jar:${KARAF_HOME}/system/org/ops4j/pax/logging/pax-logging-api/${pax.logging.version}/pax-logging-api-${pax.logging.version}.jar:${KARAF_HOME}/system/org/apache/felix/org.apache.felix.framework/${felix.framework.version}/org.apache.felix.framework-${felix.framework.version}.jar
-
-    exec $JAVA $JAVA_OPTS -Dstorage.location="${KARAF_HOME}/instances" -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $OPTS -classpath "$CLASSPATH" org.apache.felix.karaf.admin.main.Execute "$@"
-}
-
-main() {
-    init
-    run "$@"
-}
-
-main "$@"
diff --git a/karaf/assembly/src/main/filtered-resources/bin/admin.bat b/karaf/assembly/src/main/filtered-resources/bin/admin.bat
deleted file mode 100644
index 32703f8..0000000
--- a/karaf/assembly/src/main/filtered-resources/bin/admin.bat
+++ /dev/null
@@ -1,97 +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 
-
-if not "%ECHO%" == "" echo %ECHO%
-
-setlocal
-set DIRNAME=%~dp0%
-set PROGNAME=%~nx0%
-set ARGS=%*
-
-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%
-)
-
-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\felix\karaf\admin\org.apache.felix.karaf.admin.command\${project.version}\org.apache.felix.karaf.admin.command-${project.version}.jar;%KARAF_HOME%\system\org\apache\felix\karaf\admin\org.apache.felix.karaf.admin.core\${project.version}\org.apache.felix.karaf.admin.core-${project.version}.jar;%KARAF_HOME%\system\org\apache\felix\karaf\shell\org.apache.felix.karaf.shell.console\${project.version}\org.apache.felix.karaf.shell.console-${project.version}.jar;%KARAF_HOME%\system\org\apache\felix\gogo\org.apache.felix.gogo.runtime\${felix.gogo.version}\org.apache.felix.gogo.runtime-${felix.gogo.version}.jar;%KARAF_HOME%\system\org\apache\aries\blueprint\org.apache.aries.blueprint\${aries.blueprint.version}\org.apache.aries.blueprint-${aries.blueprint.version}.jar;%KARAF_HOME%\system\org\ops4j\pax\logging\pax-logging-api\${pax.logging.version}\pax-logging-api-${pax.logging.version}.jar;%KARAF_HOME%\system\org\apache\felix\org.apache.felix.framework\${felix.framework.version}\org.apache.felix.framework-${felix.framework.version}.jar
-
-:EXECUTE
-    if "%SHIFT%" == "true" SET ARGS=%2 %3 %4 %5 %6 %7 %8
-    if not "%SHIFT%" == "true" SET ARGS=%1 %2 %3 %4 %5 %6 %7 %8    
-    rem Execute the Java Virtual Machine
-    "%JAVA%" %JAVA_OPTS% %OPTS% -classpath "%CLASSPATH%" -Dstorage.location="%KARAF_HOME%\instances" -Dkaraf.home="%KARAF_HOME%" -Dkaraf.base="%KARAF_BASE%" -Djava.util.logging.config.file="%KARAF_BASE%\etc\java.util.logging.properties" org.apache.felix.karaf.admin.main.Execute %ARGS%
-
-rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
-
-:END
-
-endlocal
-
diff --git a/karaf/assembly/src/main/filtered-resources/demos/web/README.txt b/karaf/assembly/src/main/filtered-resources/demos/web/README.txt
deleted file mode 100644
index 955f047..0000000
--- a/karaf/assembly/src/main/filtered-resources/demos/web/README.txt
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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
--------
-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 Felix 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 command:
-
-    java -jar lib/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 Felix Karaf client
-as described in the "Running a Client" section above.
diff --git a/karaf/assembly/src/main/filtered-resources/etc/config.properties b/karaf/assembly/src/main/filtered-resources/etc/config.properties
deleted file mode 100644
index 22d8f13..0000000
--- a/karaf/assembly/src/main/filtered-resources/etc/config.properties
+++ /dev/null
@@ -1,343 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT 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
-
-#
-# Location of the OSGi frameworks
-#
-karaf.framework.equinox=${karaf.default.repository}/org/eclipse/osgi/${equinox.version}/osgi-${equinox.version}.jar
-karaf.framework.felix=${karaf.default.repository}/org/apache/felix/org.apache.felix.framework/${felix.framework.version}/org.apache.felix.framework-${felix.framework.version}.jar
-
-#
-# Framework config properties.
-#
-org.osgi.framework.system.packages=org.osgi.framework; version=1.5.0, \
- org.osgi.framework.launch; version=1.0.0, \
- org.osgi.framework.hooks.service; version=1.0.0, \
- org.osgi.service.packageadmin; version=1.2.0, \
- org.osgi.service.startlevel; version=1.1.0, \
- org.osgi.service.url; version=1.0.0, \
- org.osgi.util.tracker; version=1.4.0 \
- ${jre-${java.specification.version}}
-
-org.osgi.framework.system.packages.extra=\
- org.apache.felix.karaf.jaas.boot; version=${karaf.osgi.version}, \
- org.apache.felix.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.*
-
-# OSGi Execution Environment
-org.osgi.framework.executionenvironment=J2SE-1.5,J2SE-1.4,J2SE-1.3
-
-# 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
-
-karaf.shutdown.port.file=${karaf.base}/data/port
-
-#
-# FileMonitor properties
-#
-felix.fileinstall.dir    = ${karaf.base}/etc
-felix.fileinstall.filter = .*\\.cfg
-felix.fileinstall.poll   = 1000
-felix.fileinstall.noInitialDelay = true
-
-#
-# Delay for writing the framework state to disk in equinox
-# must be  >= 1000 and <= 1800000
-#
-eclipse.stateSaveDelayInterval = 1000
-
-#
-# 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.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.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.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.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.transform, \
- javax.xml.transform.dom, \
- javax.xml.transform.sax, \
- javax.xml.transform.stax, \
- 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.w3c.dom.xpath, \
- org.xml.sax, \
- org.xml.sax.ext, \
- org.xml.sax.helpers
diff --git a/karaf/assembly/src/main/filtered-resources/etc/org.apache.felix.karaf.features.cfg b/karaf/assembly/src/main/filtered-resources/etc/org.apache.felix.karaf.features.cfg
deleted file mode 100644
index a3d4a82..0000000
--- a/karaf/assembly/src/main/filtered-resources/etc/org.apache.felix.karaf.features.cfg
+++ /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.
-#
-################################################################################
-
-#
-# Comma separated list of features repositories to register by default
-#
-featuresRepositories=mvn:org.apache.felix.karaf/apache-felix-karaf/${project.version}/xml/features
-
-#
-# Comma separated list of features to install at startup
-#
-featuresBoot=ssh,management
diff --git a/karaf/assembly/src/main/filtered-resources/etc/startup.properties b/karaf/assembly/src/main/filtered-resources/etc/startup.properties
deleted file mode 100644
index 0ed8095..0000000
--- a/karaf/assembly/src/main/filtered-resources/etc/startup.properties
+++ /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.
-#
-################################################################################
-
-# 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.prefs/${felix.prefs.version}/org.apache.felix.prefs-${felix.prefs.version}.jar=10
-org/apache/felix/org.apache.felix.fileinstall/${felix.fileinstall.version}/org.apache.felix.fileinstall-${felix.fileinstall.version}.jar=11
-
-#
-# The rest of the services..
-#
-org/apache/aries/blueprint/org.apache.aries.blueprint/${aries.blueprint.version}/org.apache.aries.blueprint-${aries.blueprint.version}.jar=20
-
-org/apache/felix/gogo/org.apache.felix.gogo.runtime/${felix.gogo.version}/org.apache.felix.gogo.runtime-${felix.gogo.version}.jar=30
-org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.console/${project.version}/org.apache.felix.karaf.shell.console-${project.version}.jar=30
-org/apache/felix/karaf/deployer/org.apache.felix.karaf.deployer.spring/${project.version}/org.apache.felix.karaf.deployer.spring-${project.version}.jar=30
-org/apache/felix/karaf/deployer/org.apache.felix.karaf.deployer.blueprint/${project.version}/org.apache.felix.karaf.deployer.blueprint-${project.version}.jar=30
-org/apache/felix/karaf/deployer/org.apache.felix.karaf.deployer.features/${project.version}/org.apache.felix.karaf.deployer.features-${project.version}.jar=30
-org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.osgi/${project.version}/org.apache.felix.karaf.shell.osgi-${project.version}.jar=30
-org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.log/${project.version}/org.apache.felix.karaf.shell.log-${project.version}.jar=30
-org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.config/${project.version}/org.apache.felix.karaf.shell.config-${project.version}.jar=30
-org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.packages/${project.version}/org.apache.felix.karaf.shell.packages-${project.version}.jar=30
-org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.commands/${project.version}/org.apache.felix.karaf.shell.commands-${project.version}.jar=30
-org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.dev/${project.version}/org.apache.felix.karaf.shell.dev-${project.version}.jar=30
-org/apache/felix/karaf/jaas/org.apache.felix.karaf.jaas.config/${project.version}/org.apache.felix.karaf.jaas.config-${project.version}.jar=30
-org/apache/felix/karaf/jaas/org.apache.felix.karaf.jaas.modules/${project.version}/org.apache.felix.karaf.jaas.modules-${project.version}.jar=30
-org/apache/felix/karaf/admin/org.apache.felix.karaf.admin.core/${project.version}/org.apache.felix.karaf.admin.core-${project.version}.jar=30
-org/apache/felix/karaf/admin/org.apache.felix.karaf.admin.command/${project.version}/org.apache.felix.karaf.admin.command-${project.version}.jar=30
-org/apache/felix/karaf/admin/org.apache.felix.karaf.admin.management/${project.version}/org.apache.felix.karaf.admin.management-${project.version}.jar=30
-org/apache/felix/karaf/features/org.apache.felix.karaf.features.core/${project.version}/org.apache.felix.karaf.features.core-${project.version}.jar=30
-org/apache/felix/karaf/features/org.apache.felix.karaf.features.command/${project.version}/org.apache.felix.karaf.features.command-${project.version}.jar=30
-org/apache/felix/karaf/features/org.apache.felix.karaf.features.management/${project.version}/org.apache.felix.karaf.features.management-${project.version}.jar=30
-
-org/apache/felix/karaf/org.apache.felix.karaf.management/${project.version}/org.apache.felix.karaf.management-${project.version}.jar=30
-org/apache/aries/jmx/org.apache.aries.jmx/${aries.jmx.version}/org.apache.aries.jmx-${aries.jmx.version}.jar=30
-org/apache/aries/jmx/org.apache.aries.jmx.blueprint/${aries.jmx.version}/org.apache.aries.jmx.blueprint-${aries.jmx.version}.jar=30
-
-org/apache/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/felix/karaf/shell/org.apache.felix.karaf.shell.ssh/${project.version}/org.apache.felix.karaf.shell.ssh-${project.version}.jar=30
diff --git a/karaf/assembly/src/main/filtered-resources/features.xml b/karaf/assembly/src/main/filtered-resources/features.xml
deleted file mode 100644
index a8036e6..0000000
--- a/karaf/assembly/src/main/filtered-resources/features.xml
+++ /dev/null
@@ -1,90 +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}">
-    <feature name="spring" version="${spring.version}">
-        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.aopalliance/${aopalliance.version}</bundle>
-        <bundle>mvn:org.springframework/spring-core/${spring.version}</bundle>
-        <bundle>mvn:org.springframework/spring-beans/${spring.version}</bundle>
-        <bundle>mvn:org.springframework/spring-aop/${spring.version}</bundle>        
-        <bundle>mvn:org.springframework/spring-context/${spring.version}</bundle>
-        <bundle>mvn:org.springframework/spring-context-support/${spring.version}</bundle>
-    </feature>
-    <feature name="spring-dm" version="${spring.osgi.version}">
-        <feature version="${spring.version}">spring</feature>
-        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.cglib/${cglib.version}</bundle>
-        <bundle>mvn:org.springframework.osgi/spring-osgi-io/${spring.osgi.version}</bundle>
-        <bundle>mvn:org.springframework.osgi/spring-osgi-core/${spring.osgi.version}</bundle>
-        <bundle>mvn:org.springframework.osgi/spring-osgi-extender/${spring.osgi.version}</bundle>
-        <bundle>mvn:org.springframework.osgi/spring-osgi-annotation/${spring.osgi.version}</bundle>
-        <bundle>mvn:org.apache.felix.karaf.deployer/org.apache.felix.karaf.deployer.spring/${project.version}</bundle>
-    </feature>
-    <feature name="wrapper" version="${project.version}">
-        <bundle>mvn:org.apache.felix.karaf.shell/org.apache.felix.karaf.shell.wrapper/${project.version}</bundle>
-    </feature>
-    <feature name="obr" version="${project.version}">
-        <bundle>mvn:org.apache.felix/org.apache.felix.bundlerepository/${felix.bundlerepository.version}</bundle>
-        <bundle>mvn:org.apache.felix.karaf.shell/org.apache.felix.karaf.shell.obr/${project.version}</bundle>
-    </feature>
-    <feature name="http" version="${project.version}">
-        <config name="org.ops4j.pax.web">
-          org.osgi.service.http.port=8181
-        </config>
-        <bundle>mvn:org.apache.geronimo.specs/geronimo-servlet_2.5_spec/${geronimo.servlet.version}</bundle>
-        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jetty-bundle/${jetty.bundle.version}</bundle>
-        <bundle>mvn:org.ops4j.pax.web/pax-web-api/${pax.web.version}</bundle>
-        <bundle>mvn:org.ops4j.pax.web/pax-web-spi/${pax.web.version}</bundle>
-        <bundle>mvn:org.ops4j.pax.web/pax-web-runtime/${pax.web.version}</bundle>
-        <bundle>mvn:org.ops4j.pax.web/pax-web-jetty/${pax.web.version}</bundle>
-    </feature>
-    <feature name="war" version="${project.version}">
-        <feature version="${project.version}">http</feature>
-        <bundle>mvn:org.ops4j.pax.web/pax-web-jsp/${pax.web.version}</bundle>
-        <bundle>mvn:org.ops4j.pax.web/pax-web-extender-war/${pax.web.version}</bundle>
-        <bundle>mvn:org.ops4j.pax.web/pax-web-extender-whiteboard/${pax.web.version}</bundle>
-        <bundle>mvn:org.ops4j.pax.url/pax-url-war/${pax.url.version}</bundle>
-        <bundle>mvn:org.apache.felix.karaf.deployer/org.apache.felix.karaf.deployer.war/${project.version}</bundle>
-    </feature>
-    <feature name="webconsole" version="${project.version}">
-        <feature version="${project.version}">http</feature>
-        <config name="org.apache.felix.karaf.webconsole">
-          realm=karaf
-        </config>
-        <bundle>mvn:org.apache.felix/org.apache.felix.metatype/${felix.metatype.version}</bundle>
-        <bundle>mvn:org.apache.felix.karaf.webconsole/org.apache.felix.karaf.webconsole.branding/${project.version}</bundle>
-        <bundle>mvn:org.apache.felix/org.apache.felix.webconsole/${felix.webconsole.version}</bundle>
-        <bundle>mvn:org.apache.felix.karaf.webconsole/org.apache.felix.karaf.webconsole.admin/${project.version}</bundle>
-        <bundle>mvn:org.apache.felix.karaf.webconsole/org.apache.felix.karaf.webconsole.features/${project.version}</bundle>
-        <bundle>mvn:org.apache.felix.karaf.webconsole/org.apache.felix.karaf.webconsole.gogo/${project.version}</bundle>
-    </feature>
-    <feature name="ssh" version="${project.version}">
-        <config name="org.apache.felix.karaf.shell.ssh">
-            sshPort=8101
-            sshHost=0.0.0.0
-            sshRealm=karaf
-        </config>
-        <bundle>mvn:org.apache.mina/mina-core/${mina.version}</bundle>
-        <bundle>mvn:org.apache.sshd/sshd-core/${sshd.version}</bundle>
-        <bundle>mvn:org.apache.felix.karaf.shell/org.apache.felix.karaf.shell.ssh/${project.version}</bundle>
-    </feature>
-    <feature name="management" version="${project.version}">
-        <bundle>mvn:org.apache.felix.karaf/org.apache.felix.karaf.management/${project.version}</bundle>
-        <bundle>mvn:org.apache.aries.jmx/org.apache.aries.jmx/${aries.jmx.version}</bundle>
-        <bundle>mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint/${aries.jmx.version}</bundle>
-    </feature>
-</features>
diff --git a/karaf/client/NOTICE b/karaf/client/NOTICE
deleted file mode 100644
index d0afbf7..0000000
--- a/karaf/client/NOTICE
+++ /dev/null
@@ -1,19 +0,0 @@
-Apache Felix Karaf :: Client
-Copyright 2007-2010 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.
-
-
-II. Used Software
-
-
-
-III. License Summary
-- Apache License 2.0
-
-
diff --git a/karaf/client/pom.xml b/karaf/client/pom.xml
deleted file mode 100644
index bcaacba..0000000
--- a/karaf/client/pom.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf</groupId>
-    <artifactId>org.apache.felix.karaf.client</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Client</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.sshd</groupId>
-            <artifactId>sshd-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.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>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <_donotcopy>(CVS|.svn|config.properties)</_donotcopy>
-                        <Main-Class>org.apache.felix.karaf.client.Main</Main-Class>
-                        <!-- Do not use \r\n in the Class-Path header because the maven-bundle-plugin remove those -->
-                        <Class-Path>
-                            ../system/org/apache/sshd/sshd-core/${sshd.version}/sshd-core-${sshd.version}.jar ../system/org/apache/mina/mina-core/${mina.version}/mina-core-${mina.version}.jar ../system/org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.console/${project.version}/org.apache.felix.karaf.shell.console-${project.version}.jar
-                        </Class-Path>
-                        <Bundle-Name>Apache Felix Karaf Shell Client</Bundle-Name>
-                        <Bundle-Description>Shell client bundle for Apache Felix Karaf.</Bundle-Description>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Export-Package>${project.artifactId}*;version=${project.version}</Export-Package>
-                        <Private-Package>
-                            org.apache.felix.karaf.client;-split-package:=merge-first,
-                            org.slf4j;-split-package:=merge-first,
-                            org.slf4j.spi;-split-package:=merge-first,
-                            org.slf4j.helpers;-split-package:=merge-first,
-                            org.slf4j.impl;-split-package:=merge-first,
-                            META-INF;-split-package:=merge-first
-                        </Private-Package>
-                        <Import-Package>!*</Import-Package>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>${project.groupId}:${project.artifactId}</include>
-                                    <include>org.slf4j:slf4j-api</include>
-                                    <include>org.slf4j:slf4j-nop</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.slf4j:slf4j-api</artifact>
-                                    <excludes>
-                                        <exclude>org/slf4j/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.slf4j:slf4j-nop</artifact>
-                                    <excludes>
-                                        <exclude>org/slf4j/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-    
-
-</project>
diff --git a/karaf/client/src/main/java/org/apache/felix/karaf/client/Main.java b/karaf/client/src/main/java/org/apache/felix/karaf/client/Main.java
deleted file mode 100644
index f010b2b..0000000
--- a/karaf/client/src/main/java/org/apache/felix/karaf/client/Main.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.felix.karaf.client;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-
-import jline.Terminal;
-import org.apache.felix.karaf.shell.console.jline.TerminalFactory;
-import org.apache.sshd.ClientChannel;
-import org.apache.sshd.ClientSession;
-import org.apache.sshd.SshClient;
-import org.apache.sshd.client.channel.ChannelShell;
-import org.apache.sshd.client.future.ConnectFuture;
-import org.apache.sshd.common.RuntimeSshException;
-
-import org.fusesource.jansi.AnsiConsole;
-import org.slf4j.impl.SimpleLogger;
-
-/**
- * A very simple
- */
-public class Main {
-
-    public static void main(String[] args) throws Exception {
-        String host = "localhost";
-        int port = 8101;
-        String user = "karaf";
-        String password = "karaf";
-        StringBuilder sb = new StringBuilder();
-        int level = 1;
-        int retryAttempts = 0;
-        int retryDelay = 2;
-
-        for (int i = 0; i < args.length; i++) {
-            if (args[i].charAt(0) == '-') {
-                if (args[i].equals("-a")) {
-                    port = Integer.parseInt(args[++i]);
-                } else if (args[i].equals("-h")) {
-                    host = args[++i];
-                } else if (args[i].equals("-u")) {
-                    user = args[++i];
-                } else if (args[i].equals("-p")) {
-                    password = args[++i];
-                } else if (args[i].equals("-v")) {
-                    level++;
-                } else if (args[i].equals("-r")) {
-                    retryAttempts = Integer.parseInt(args[++i]);
-                } else if (args[i].equals("-d")) {
-                    retryDelay = Integer.parseInt(args[++i]);
-                } else if (args[i].equals("--help")) {
-                    System.out.println("Apache Felix Karaf client");
-                    System.out.println("  -a [port]     specify the port to connect to");
-                    System.out.println("  -h [host]     specify the host to connect to");
-                    System.out.println("  -u [user]     specify the user name");
-                    System.out.println("  -p [password] specify the password");
-                    System.out.println("  --help        shows this help message");
-                    System.out.println("  -v            raise verbosity");
-                    System.out.println("  -r [attempts] retry connection establishment (up to attempts times)");
-                    System.out.println("  -d [delay]    intra-retry delay (defaults to 2 seconds)");
-                    System.out.println("  [commands]    commands to run");
-                    System.out.println("If no commands are specified, the client will be put in an interactive mode");
-                    System.exit(0);
-                } else {
-                    System.err.println("Unknown option: " + args[i]);
-                    System.err.println("Run with --help for usage");
-                    System.exit(1);
-                }
-            } else {
-                sb.append(args[i]);
-                sb.append(' ');
-            }
-        }
-        SimpleLogger.setLevel(level);
-
-        SshClient client = null;
-        Terminal terminal = null;
-        try {
-            client = SshClient.setUpDefaultClient();
-            client.start();
-            int retries = 0;
-            ClientSession session = null;
-            do {
-                ConnectFuture future = client.connect(host, port);
-                future.await();
-                try { 
-                    session = future.getSession();
-                } catch (RuntimeSshException ex) {
-                    if (retries++ < retryAttempts) {
-                        Thread.sleep(retryDelay * 1000);
-                        System.out.println("retrying (attempt " + retries + ") ...");
-                    } else {
-                        throw ex;
-                    }
-                }
-            } while (session == null);
-            if (!session.authPassword(user, password).await().isSuccess()) {
-                throw new Exception("Authentication failure");
-            }
-            ClientChannel channel;
-			if (sb.length() > 0) {
- 				channel = session.createChannel("exec");
-	            channel.setIn(new ByteArrayInputStream(sb.append("\n").toString().getBytes()));
-			} else {
-                terminal = new TerminalFactory().getTerminal();
- 				channel = session.createChannel("shell");
-                channel.setIn(System.in);
-                ((ChannelShell) channel).setupSensibleDefaultPty();
-            }
-            channel.setOut(AnsiConsole.wrapOutputStream(System.out));
-            channel.setErr(AnsiConsole.wrapOutputStream(System.err));
-            channel.open();
-            channel.waitFor(ClientChannel.CLOSED, 0);
-        } catch (Throwable t) {
-            if (level > 1) {
-                t.printStackTrace();
-            } else {
-                System.err.println(t.getMessage());
-            }
-            System.exit(1);
-        } finally {
-            try {
-                client.stop();
-            } catch (Throwable t) { }
-            try {
-                if (terminal != null) {
-                    terminal.restoreTerminal();
-                }
-            } catch (Throwable t) { }
-        }
-        System.exit(0);
-    }
-
-}
diff --git a/karaf/client/src/main/java/org/slf4j/impl/SimpleLogger.java b/karaf/client/src/main/java/org/slf4j/impl/SimpleLogger.java
deleted file mode 100644
index 1bf6e2d..0000000
--- a/karaf/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);
-            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);
-            doLog(level, msg, null);
-        }
-    }
-
-    protected void log(int level, String format, Object[] args) {
-        if (isLogEnabled(level)) {
-            String msg = MessageFormatter.format(format, args);
-            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/client/src/main/resources/client.login.conf b/karaf/client/src/main/resources/client.login.conf
deleted file mode 100644
index 1e190f1..0000000
--- a/karaf/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/demos/pom.xml b/karaf/demos/pom.xml
deleted file mode 100644
index 62c85ba..0000000
--- a/karaf/demos/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.demos</groupId>
-    <artifactId>demos</artifactId>
-    <packaging>pom</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Demos</name>
-
-    <modules>
-        <module>web</module>
-    </modules>
-
-</project>
diff --git a/karaf/demos/web/NOTICE b/karaf/demos/web/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/demos/web/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/demos/web/pom.xml b/karaf/demos/web/pom.xml
deleted file mode 100644
index b19223f..0000000
--- a/karaf/demos/web/pom.xml
+++ /dev/null
@@ -1,159 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.felix.karaf.demos</groupId>
-    <artifactId>demos</artifactId>
-    <version>1.7.0-SNAPSHOT</version>
-  </parent>
-
-  <groupId>org.apache.felix.karaf.demos</groupId>
-  <artifactId>web</artifactId>
-  <packaging>war</packaging>
-  <name>Apache Felix Karaf :: Demos :: web</name>
-  
-  <properties>
-    <jetty.port>8080</jetty.port>
-    <jetty.version>6.1.12rc1</jetty.version>
-    <geronimo.servlet.version>1.1.2</geronimo.servlet.version>
-
-    <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-  </properties>
-
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.felix.karaf</groupId>
-      <artifactId>org.apache.felix.karaf.main</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.felix.karaf.jaas</groupId>
-      <artifactId>org.apache.felix.karaf.jaas.boot</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.felix.karaf</groupId>
-      <artifactId>apache-felix-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>
-        <version>2.1-beta-1</version>
-        <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>${jetty.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>
-          <version>2.0</version>
-          <executions>
-              <execution>
-                  <id>unpack-unix</id>
-                  <phase>generate-resources</phase>
-                  <goals>
-                      <goal>unpack</goal>
-                  </goals>
-                  <configuration>
-                      <artifactItems>
-                          <artifactItem>
-                              <groupId>org.apache.felix.karaf</groupId>
-                              <artifactId>apache-felix-karaf</artifactId>
-                              <type>zip</type>
-                              <overWrite>true</overWrite>
-                              <outputDirectory>${project.build.directory}/karaf/WEB-INF</outputDirectory>
-                              <excludes>**/lib/*,**/*.txt,**/bin/*,**/demos/**,**/lib,**/bin,**/demos</excludes>
-                          </artifactItem>
-                      </artifactItems>
-                  </configuration>
-              </execution>
-        </executions>
-      </plugin>
-      <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-antrun-plugin</artifactId>
-          <executions>
-              <execution>
-                  <id>copy-karaf</id>
-                  <phase>process-resources</phase>
-                  <goals>
-                      <goal>run</goal>
-                  </goals>
-                  <configuration>
-                      <tasks>
-                          <move todir="${project.build.directory}/karaf/WEB-INF/karaf">
-                              <fileset dir="${project.build.directory}/karaf/WEB-INF/apache-felix-karaf-${project.version}" />
-                          </move>
-                      </tasks>
-                  </configuration>
-              </execution>
-          </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
\ No newline at end of file
diff --git a/karaf/demos/web/src/main/java/org/apache/felix/karaf/web/WebAppListener.java b/karaf/demos/web/src/main/java/org/apache/felix/karaf/web/WebAppListener.java
deleted file mode 100644
index e988278..0000000
--- a/karaf/demos/web/src/main/java/org/apache/felix/karaf/web/WebAppListener.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.felix.karaf.web;
-
-import java.io.File;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-
-import org.apache.felix.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.startLocalConsole", "false");
-			System.setProperty("karaf.startRemoteShell", "true");
-			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(false);
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-}
diff --git a/karaf/demos/web/src/main/webapp/WEB-INF/web.xml b/karaf/demos/web/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 4e2471b..0000000
--- a/karaf/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.felix.karaf.web.WebAppListener</listener-class>
-  </listener>
-
-  <welcome-file-list>
-    <welcome-file>index.jsp</welcome-file>
-  </welcome-file-list>
-		
-</web-app>
diff --git a/karaf/demos/web/src/main/webapp/index.jsp b/karaf/demos/web/src/main/webapp/index.jsp
deleted file mode 100644
index ab13f33..0000000
--- a/karaf/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 Felix 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://felix.apache.org/site/apache-felix-karaf.html">Apache Karaf Site</a>
-</p>
-</body>
-</html>
-	
diff --git a/karaf/deployer/blueprint/NOTICE b/karaf/deployer/blueprint/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/deployer/blueprint/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/deployer/blueprint/pom.xml b/karaf/deployer/blueprint/pom.xml
deleted file mode 100644
index d3bc534..0000000
--- a/karaf/deployer/blueprint/pom.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.deployer</groupId>
-        <artifactId>deployer</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.deployer</groupId>
-    <artifactId>org.apache.felix.karaf.deployer.blueprint</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Blueprint Deployer</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.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.osgi</groupId>
-            <artifactId>spring-osgi-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.fileinstall</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <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>!${project.artifactId}*,*</Import-Package>
-                        <Private-Package>org.apache.felix.karaf.deployer.blueprint</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf/deployer/blueprint/src/main/java/org/apache/felix/karaf/deployer/blueprint/BlueprintDeploymentListener.java b/karaf/deployer/blueprint/src/main/java/org/apache/felix/karaf/deployer/blueprint/BlueprintDeploymentListener.java
deleted file mode 100644
index e11e958..0000000
--- a/karaf/deployer/blueprint/src/main/java/org/apache/felix/karaf/deployer/blueprint/BlueprintDeploymentListener.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.felix.karaf.deployer.blueprint;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.net.URL;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.w3c.dom.Document;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.felix.fileinstall.ArtifactTransformer;
-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 static final Log LOGGER = LogFactory.getLog(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/deployer/blueprint/src/main/java/org/apache/felix/karaf/deployer/blueprint/BlueprintTransformer.java b/karaf/deployer/blueprint/src/main/java/org/apache/felix/karaf/deployer/blueprint/BlueprintTransformer.java
deleted file mode 100644
index 1c5c0ed..0000000
--- a/karaf/deployer/blueprint/src/main/java/org/apache/felix/karaf/deployer/blueprint/BlueprintTransformer.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.deployer.blueprint;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.jar.JarFile;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.zip.ZipEntry;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import org.osgi.framework.Constants;
-
-public class BlueprintTransformer {
-
-    static Transformer transformer;
-    static DocumentBuilderFactory dbf;
-    static TransformerFactory tf;
-
-
-    public static void transform(URL url, OutputStream os) throws Exception {
-        // Build dom document
-        Document doc = parse(url);
-        // Heuristicly retrieve name and version
-        String name = url.getPath();
-        int idx = name.lastIndexOf('/');
-        if (idx >= 0) {
-            name = name.substring(idx + 1);
-        }
-        String[] str = extractNameVersionType(name);
-        // Create manifest
-        Manifest m = new Manifest();
-        m.getMainAttributes().putValue("Manifest-Version", "2");
-        m.getMainAttributes().putValue(Constants.BUNDLE_MANIFESTVERSION, "2");
-        m.getMainAttributes().putValue(Constants.BUNDLE_SYMBOLICNAME, str[0]);
-        m.getMainAttributes().putValue(Constants.BUNDLE_VERSION, str[1]);
-        String importPkgs = getImportPackages(analyze(new DOMSource(doc)));
-        if (importPkgs != null && importPkgs.length() > 0) {
-            m.getMainAttributes().putValue(Constants.IMPORT_PACKAGE, importPkgs);
-        }
-        m.getMainAttributes().putValue(Constants.DYNAMICIMPORT_PACKAGE, "*");
-        // Extract manifest entries from the DOM
-        NodeList l = doc.getElementsByTagName("manifest");
-        if (l != null) {
-            for (int i = 0; i < l.getLength(); i++) {
-                Element e = (Element) l.item(i);
-                String text = e.getTextContent();
-                Properties props = new Properties();
-                props.load(new ByteArrayInputStream(text.trim().getBytes()));
-                Enumeration en = props.propertyNames();
-                while (en.hasMoreElements()) {
-                    String k = (String) en.nextElement();
-                    String v = props.getProperty(k);
-                    m.getMainAttributes().putValue(k, v);
-                }
-                e.getParentNode().removeChild(e);
-            }
-        }
-
-        JarOutputStream out = new JarOutputStream(os);
-        ZipEntry e = new ZipEntry(JarFile.MANIFEST_NAME);
-        out.putNextEntry(e);
-        m.write(out);
-        out.closeEntry();
-        e = new ZipEntry("OSGI-INF/");
-        out.putNextEntry(e);
-        e = new ZipEntry("OSGI-INF/blueprint/");
-        out.putNextEntry(e);
-        out.closeEntry();
-        e = new ZipEntry("OSGI-INF/blueprint/" + name);
-        out.putNextEntry(e);
-        // Copy the new DOM
-        if (tf == null) {
-            tf = TransformerFactory.newInstance();
-        }
-        tf.newTransformer().transform(new DOMSource(doc), new StreamResult(out));
-        out.closeEntry();
-        out.close();
-    }
-
-    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);
-
-    public static String[] extractNameVersionType(String url) {
-        Matcher m = ARTIFACT_MATCHER.matcher(url);
-        if (!m.matches()) {
-            return new String[] { url, DEFAULT_VERSION };
-        }
-        else {
-            //System.err.println(m.groupCount());
-            //for (int i = 1; i <= m.groupCount(); i++) {
-            //    System.err.println("Group " + i + ": " + m.group(i));
-            //}
-
-            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);
-            }
-        }
-    }
-
-    public static Set<String> analyze(Source source) throws Exception {
-        if (transformer == null) {
-            if (tf == null) {
-                tf = TransformerFactory.newInstance();
-            }
-            Source s = new StreamSource(BlueprintTransformer.class.getResourceAsStream("extract.xsl"));
-            transformer = tf.newTransformer(s);
-        }
-
-        Set<String> refers = new TreeSet<String>();
-
-        ByteArrayOutputStream bout = new ByteArrayOutputStream();
-        Result r = new StreamResult(bout);
-        transformer.transform(source, r);
-
-        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
-        bout.close();
-
-        BufferedReader br = new BufferedReader(new InputStreamReader(bin));
-
-        String line = br.readLine();
-        while (line != null) {
-            line = line.trim();
-            if (line.length() > 0) {
-                String parts[] = line.split("\\s*,\\s*");
-                for (int i = 0; i < parts.length; i++) {
-                    int n = parts[i].lastIndexOf('.');
-                    if (n > 0) {
-                        String pkg = parts[i].substring(0, n);
-                        if (!pkg.startsWith("java.")) {
-                            refers.add(pkg);
-                        }
-                    }
-                }
-            }
-            line = br.readLine();
-        }
-        br.close();
-        return refers;
-    }
-
-    protected static String getImportPackages(Set<String> packages) {
-        StringBuilder sb = new StringBuilder();
-        for (String pkg : packages) {
-            if (sb.length() > 0) {
-                sb.append(",");
-            }
-            sb.append(pkg);
-        }
-        return sb.toString();
-    }
-
-    protected static Document parse(URL url) throws Exception {
-        if (dbf == null) {
-            dbf = DocumentBuilderFactory.newInstance();
-            dbf.setNamespaceAware(true);
-        }
-        DocumentBuilder db = dbf.newDocumentBuilder();
-        return db.parse(url.toString());
-    }
-
-    protected static void copyInputStream(InputStream in, OutputStream out) throws Exception {
-        byte[] buffer = new byte[4096];
-        int len = in.read(buffer);
-        while (len >= 0) {
-            out.write(buffer, 0, len);
-            len = in.read(buffer);
-        }
-    }
-}
diff --git a/karaf/deployer/blueprint/src/main/java/org/apache/felix/karaf/deployer/blueprint/BlueprintURLHandler.java b/karaf/deployer/blueprint/src/main/java/org/apache/felix/karaf/deployer/blueprint/BlueprintURLHandler.java
deleted file mode 100644
index ca6d344..0000000
--- a/karaf/deployer/blueprint/src/main/java/org/apache/felix/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.felix.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.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.osgi.service.url.AbstractURLStreamHandlerService;
-
-/**
- * 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 static Log logger = LogFactory.getLog(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 can not 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/deployer/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint-deployer.xml b/karaf/deployer/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint-deployer.xml
deleted file mode 100644
index bc55e2e..0000000
--- a/karaf/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">
-
-    <service id="blueprintUrlHandler" interface="org.osgi.service.url.URLStreamHandlerService">
-        <service-properties>
-            <entry key="url.handler.protocol" value="blueprint"/>
-        </service-properties>
-        <bean class="org.apache.felix.karaf.deployer.blueprint.BlueprintURLHandler"/>
-    </service>
-
-    <bean id="blueprintDeploymentListener" class="org.apache.felix.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/deployer/blueprint/src/main/resources/org/apache/felix/karaf/deployer/blueprint/extract.xsl b/karaf/deployer/blueprint/src/main/resources/org/apache/felix/karaf/deployer/blueprint/extract.xsl
deleted file mode 100644
index eb44e25..0000000
--- a/karaf/deployer/blueprint/src/main/resources/org/apache/felix/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/deployer/blueprint/src/test/java/org/apache/felix/karaf/deployer/blueprint/BlueprintDeploymentListenerTest.java b/karaf/deployer/blueprint/src/test/java/org/apache/felix/karaf/deployer/blueprint/BlueprintDeploymentListenerTest.java
deleted file mode 100644
index 2351a0b..0000000
--- a/karaf/deployer/blueprint/src/test/java/org/apache/felix/karaf/deployer/blueprint/BlueprintDeploymentListenerTest.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.felix.karaf.deployer.blueprint;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.jar.JarInputStream;
-
-import javax.xml.transform.dom.DOMSource;
-
-import junit.framework.TestCase;
-
-public class BlueprintDeploymentListenerTest extends TestCase {
-
-    public void testPackagesExtraction() throws Exception {
-        BlueprintDeploymentListener l = new BlueprintDeploymentListener();
-        File f = new File(getClass().getClassLoader().getResource("test.xml").toURI());
-        Set<String> pkgs = BlueprintTransformer.analyze(new DOMSource(BlueprintTransformer.parse(f.toURL())));
-        assertNotNull(pkgs);
-        assertEquals(1, pkgs.size());
-        Iterator<String> it = pkgs.iterator();
-        assertEquals("org.apache.aries.blueprint.sample", it.next());
-    }
-
-    public void testCustomManifest() throws Exception {
-        File f = File.createTempFile("smx", ".jar");
-        try {
-            OutputStream os = new FileOutputStream(f);
-            BlueprintTransformer.transform(getClass().getClassLoader().getResource("test.xml"), os);
-            os.close();
-            InputStream is = new FileInputStream(f);
-            JarInputStream jar = new JarInputStream(is);
-            jar.getManifest().write(System.err);
-            is.close();
-        } finally {
-            f.delete();
-        }
-    }
-
-    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 = BlueprintTransformer.extractNameVersionType(s);
-        assertEquals(expectedParts.length, parts.length);
-        for (int i = 0; i < expectedParts.length; i++) {
-            assertEquals(expectedParts[i], parts[i]);
-        }
-    }
-
-}
diff --git a/karaf/deployer/blueprint/src/test/resources/test.xml b/karaf/deployer/blueprint/src/test/resources/test.xml
deleted file mode 100644
index 158e125..0000000
--- a/karaf/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/deployer/features/NOTICE b/karaf/deployer/features/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/deployer/features/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/deployer/features/pom.xml b/karaf/deployer/features/pom.xml
deleted file mode 100644
index dd1aad3..0000000
--- a/karaf/deployer/features/pom.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.deployer</groupId>
-        <artifactId>deployer</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.deployer</groupId>
-    <artifactId>org.apache.felix.karaf.deployer.features</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Features Deployer</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.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.osgi</groupId>
-            <artifactId>spring-osgi-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.karaf.features</groupId>
-            <artifactId>org.apache.felix.karaf.features.core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.fileinstall</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <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>!${project.artifactId}*,*</Import-Package>
-                        <Private-Package>org.apache.felix.karaf.deployer.features</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf/deployer/features/src/main/java/org/apache/felix/karaf/deployer/features/FeatureDeploymentListener.java b/karaf/deployer/features/src/main/java/org/apache/felix/karaf/deployer/features/FeatureDeploymentListener.java
deleted file mode 100644
index 53789fd..0000000
--- a/karaf/deployer/features/src/main/java/org/apache/felix/karaf/deployer/features/FeatureDeploymentListener.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.deployer.features;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.*;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.w3c.dom.Document;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.felix.fileinstall.ArtifactUrlTransformer;
-import org.apache.felix.karaf.features.Feature;
-import org.apache.felix.karaf.features.FeaturesService;
-import org.apache.felix.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.felix.karaf.shell.features";
-
-    private static final Log LOGGER = LogFactory.getLog(FeatureDeploymentListener.class);
-
-    private DocumentBuilderFactory dbf;
-    private FeaturesService featuresService;
-    private BundleContext bundleContext;
-
-    public void setFeaturesService(FeaturesService featuresService) {
-        this.featuresService = featuresService;
-    }
-
-    public FeaturesService getFeaturesService() {
-        return featuresService;
-    }
-
-    public BundleContext getBundleContext() {
-        return bundleContext;
-    }
-
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-
-    public void init() throws Exception {
-        bundleContext.addBundleListener(this);
-        for (Bundle bundle : bundleContext.getBundles()) {
-            if (bundle.getState() == Bundle.RESOLVED || bundle.getState() == Bundle.STARTING
-                    || bundle.getState() == Bundle.ACTIVE)
-            bundleChanged(new BundleEvent(BundleEvent.RESOLVED, bundle));
-        }
-    }
-
-    public void destroy() throws Exception {
-        bundleContext.removeBundleListener(this);
-    }
-
-    public boolean canHandle(File artifact) {
-        try {
-            if (artifact.isFile() && artifact.getName().endsWith(".xml")) {
-                Document doc = parse(artifact);
-                String name = doc.getDocumentElement().getLocalName();
-                String uri  = doc.getDocumentElement().getNamespaceURI();
-                if ("features".equals(name) && (uri == null || "".equals(uri))) {
-                    return true;
-                }
-            }
-        } catch (Exception e) {
-            LOGGER.error("Unable to parse deployed file " + artifact.getAbsolutePath(), e);
-        }
-        return false;
-    }
-
-    public URL transform(URL artifact) {
-        // We can't really install the feature right now and just return nothing.
-        // We would not be aware of the fact that the bundle has been uninstalled
-        // and therefore require the feature to be uninstalled.
-        // So instead, create a fake bundle with the file inside, which will be listened by
-        // this deployer: installation / uninstallation of the feature will be done
-        // while the bundle is installed / uninstalled.
-        try {
-            return new URL("feature", null, artifact.toString());
-        } catch (Exception e) {
-            LOGGER.error("Unable to build feature bundle", e);
-            return null;
-        }
-    }
-
-    public void bundleChanged(BundleEvent bundleEvent) {
-            Bundle bundle = bundleEvent.getBundle();
-            if (bundleEvent.getType() == BundleEvent.RESOLVED) {
-                try {
-                    List<URL> urls = new ArrayList<URL>();
-                    Enumeration featuresUrlEnumeration = bundle.findEntries("/META-INF/" + FEATURE_PATH + "/", "*.xml", false);
-                    while (featuresUrlEnumeration != null && featuresUrlEnumeration.hasMoreElements()) {
-                        URL url = (URL) featuresUrlEnumeration.nextElement();
-                        try {
-                            featuresService.addRepository(url.toURI());
-                            for (Repository repo : featuresService.listRepositories()) {
-                                if (repo.getURI().equals(url.toURI())) {
-                                    Set<Feature> features = new HashSet<Feature>(Arrays.asList(repo.getFeatures()));
-                                    featuresService.installFeatures(features, EnumSet.noneOf(FeaturesService.Option.class));
-                                }
-                            }
-                            urls.add(url);
-                        } catch (Exception e) {
-                            LOGGER.error("Unable to install features", e);
-                        }
-                    }
-                    synchronized (this) {
-                        File file = bundleContext.getDataFile("FeatureDeploymentListener.cfg");
-                        if (file != null) {
-                            Properties props = new Properties();
-                            if (file.exists()) {
-                                InputStream input = new FileInputStream(file);
-                                try {
-                                    props.load(input);
-                                } finally {
-                                    input.close();
-                                }
-                            }
-                            String prefix = bundle.getSymbolicName() + "-" + bundle.getVersion();
-                            props.put(prefix + ".count", Integer.toString(urls.size()));
-                            for (int i = 0; i < urls.size(); i++) {
-                                props.put(prefix + ".url." + i, urls.get(i).toExternalForm());
-                            }
-                            OutputStream output = new FileOutputStream(file);
-                            try {
-                                props.store(output, null);
-                            } finally {
-                                output.close();
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    LOGGER.error("Unable to install deployed features for bundle: " + bundle.getSymbolicName() + " - " + bundle.getVersion(), e);
-                }
-            } else if (bundleEvent.getType() == BundleEvent.UNINSTALLED) {
-                try {
-                    synchronized (this) {
-                        File file = bundleContext.getDataFile("FeatureDeploymentListener.cfg");
-                        if (file != null) {
-                            Properties props = new Properties();
-                            if (file.exists()) {
-                                InputStream input = new FileInputStream(file);
-                                try {
-                                    props.load(input);
-                                } finally {
-                                    input.close();
-                                }
-                            }
-                            String prefix = bundle.getSymbolicName() + "-" + bundle.getVersion();
-                            String countStr = (String) props.get(prefix + ".count");
-                            if (countStr != null) {
-                                int count = Integer.parseInt(countStr);
-                                for (int i = 0; i < count; i++) {
-                                    URL url = new URL((String) props.get(prefix + ".url." + i));
-                                    for (Repository repo : featuresService.listRepositories()) {
-                                        try {
-                                            if (repo.getURI().equals(url.toURI())) {
-                                                for (Feature f : repo.getFeatures()) {
-                                                    try {
-                                                        featuresService.uninstallFeature(f.getName(), f.getVersion());
-                                                    } catch (Exception e) {
-                                                        LOGGER.error("Unable to uninstall feature: " + f.getName(), e);
-                                                    }
-                                                }
-                                            }
-                                        } catch (Exception e) {
-                                            LOGGER.error("Unable to uninstall features: " + url, e);
-                                        }
-                                    }
-                                    try {
-                                        featuresService.removeRepository(url.toURI());
-                                    } catch (URISyntaxException e) {
-                                        LOGGER.error("Unable to remove repository: " + url, e);
-                                    }
-                                }
-                            }
-                            for (Iterator<Object> it = props.keySet().iterator(); it.hasNext();) {
-                                if (it.next().toString().startsWith(prefix + ".")) {
-                                    it.remove();
-                                }
-                            }
-                            OutputStream output = new FileOutputStream(file);
-                            try {
-                                props.store(output, null);
-                            } finally {
-                                output.close();
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    LOGGER.error("Unable to uninstall deployed features for bundle: " + bundle.getSymbolicName() + " - " + bundle.getVersion(), e);
-                }
-            }
-    }
-
-    protected Document parse(File artifact) throws Exception {
-        if (dbf == null) {
-            dbf = DocumentBuilderFactory.newInstance();
-            dbf.setNamespaceAware(true);
-        }
-        DocumentBuilder db = dbf.newDocumentBuilder();
-        db.setErrorHandler(new ErrorHandler() {
-            public void warning(SAXParseException exception) throws SAXException {
-            }
-            public void error(SAXParseException exception) throws SAXException {
-            }
-            public void fatalError(SAXParseException exception) throws SAXException {
-                throw exception;
-            }
-        });
-        return db.parse(artifact);
-    }
-
-}
diff --git a/karaf/deployer/features/src/main/java/org/apache/felix/karaf/deployer/features/FeatureTransformer.java b/karaf/deployer/features/src/main/java/org/apache/felix/karaf/deployer/features/FeatureTransformer.java
deleted file mode 100644
index 050bec3..0000000
--- a/karaf/deployer/features/src/main/java/org/apache/felix/karaf/deployer/features/FeatureTransformer.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.felix.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.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.zip.ZipEntry;
-
-import org.osgi.framework.Constants;
-
-/**
- * Transform a feature descriptor into an osgi bundle
- */
-public class FeatureTransformer {
-
-    public static void transform(URL url, OutputStream os) throws Exception {
-        // Heuristicly retrieve name and version
-        String name = url.getPath();
-        int idx = name.lastIndexOf('/');
-        if (idx >= 0) {
-            name = name.substring(idx + 1);
-        }
-        String[] str = 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);
-        }
-    }
-
-    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);
-
-    public static String[] extractNameVersionType(String url) {
-        Matcher m = ARTIFACT_MATCHER.matcher(url);
-        if (!m.matches()) {
-            return new String[] { url, DEFAULT_VERSION };
-        }
-        else {
-            //System.err.println(m.groupCount());
-            //for (int i = 1; i <= m.groupCount(); i++) {
-            //    System.err.println("Group " + i + ": " + m.group(i));
-            //}
-
-            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/deployer/features/src/main/java/org/apache/felix/karaf/deployer/features/FeatureURLHandler.java b/karaf/deployer/features/src/main/java/org/apache/felix/karaf/deployer/features/FeatureURLHandler.java
deleted file mode 100644
index f3dad87..0000000
--- a/karaf/deployer/features/src/main/java/org/apache/felix/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.felix.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.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.osgi.service.url.AbstractURLStreamHandlerService;
-
-/**
- * URL handler for features
- */
-public class FeatureURLHandler extends AbstractURLStreamHandlerService {
-
-    private static Log logger = LogFactory.getLog(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("Blueprint 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 blueprint xml url", e);
-                throw (IOException) new IOException("Error opening blueprint xml url").initCause(e);
-            }
-        }
-    }
-
-
-}
diff --git a/karaf/deployer/features/src/main/resources/OSGI-INF/blueprint/features-deployer.xml b/karaf/deployer/features/src/main/resources/OSGI-INF/blueprint/features-deployer.xml
deleted file mode 100644
index 001f18e..0000000
--- a/karaf/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.felix.karaf.deployer.features.FeatureURLHandler"/>
-    </service>
-
-    <bean id="featureDeploymentListener" class="org.apache.felix.karaf.deployer.features.FeatureDeploymentListener"
-          init-method="init" destroy-method="destroy" activation="lazy">
-        <property name="bundleContext" ref="blueprintBundleContext"/>
-        <property name="featuresService">
-            <reference interface="org.apache.felix.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/deployer/pom.xml b/karaf/deployer/pom.xml
deleted file mode 100644
index ba03a2d..0000000
--- a/karaf/deployer/pom.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.deployer</groupId>
-    <artifactId>deployer</artifactId>
-    <packaging>pom</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Deployer</name>
-
-    <modules>
-        <module>spring</module>
-        <module>blueprint</module>
-        <module>features</module>
-        <module>war</module>
-    </modules>
-
-</project>
diff --git a/karaf/deployer/spring/NOTICE b/karaf/deployer/spring/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/deployer/spring/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/deployer/spring/pom.xml b/karaf/deployer/spring/pom.xml
deleted file mode 100644
index 51c09d2..0000000
--- a/karaf/deployer/spring/pom.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.deployer</groupId>
-        <artifactId>deployer</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.deployer</groupId>
-    <artifactId>org.apache.felix.karaf.deployer.spring</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Spring Deployer</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.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.osgi</groupId>
-            <artifactId>spring-osgi-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.fileinstall</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <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>!${project.artifactId}*,*</Import-Package>
-                        <Private-Package>org.apache.felix.karaf.deployer.spring</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf/deployer/spring/src/main/java/org/apache/felix/karaf/deployer/spring/SpringDeploymentListener.java b/karaf/deployer/spring/src/main/java/org/apache/felix/karaf/deployer/spring/SpringDeploymentListener.java
deleted file mode 100644
index 6cb15f2..0000000
--- a/karaf/deployer/spring/src/main/java/org/apache/felix/karaf/deployer/spring/SpringDeploymentListener.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.felix.karaf.deployer.spring;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.net.URL;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.w3c.dom.Document;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.felix.fileinstall.ArtifactTransformer;
-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 static final Log LOGGER = LogFactory.getLog(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/deployer/spring/src/main/java/org/apache/felix/karaf/deployer/spring/SpringTransformer.java b/karaf/deployer/spring/src/main/java/org/apache/felix/karaf/deployer/spring/SpringTransformer.java
deleted file mode 100644
index 7564ab0..0000000
--- a/karaf/deployer/spring/src/main/java/org/apache/felix/karaf/deployer/spring/SpringTransformer.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.deployer.spring;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.jar.JarFile;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.zip.ZipEntry;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import org.osgi.framework.Constants;
-
-public class SpringTransformer {
-
-    static Transformer transformer;
-    static DocumentBuilderFactory dbf;
-    static TransformerFactory tf;
-
-
-    public static void transform(URL url, OutputStream os) throws Exception {
-        // Build dom document
-        Document doc = parse(url);
-        // Heuristicly retrieve name and version
-        String name = url.getPath();
-        int idx = name.lastIndexOf('/');
-        if (idx >= 0) {
-            name = name.substring(idx + 1);
-        }
-        String[] str = 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();
-    }
-
-    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);
-
-    public static String[] extractNameVersionType(String url) {
-        Matcher m = ARTIFACT_MATCHER.matcher(url);
-        if (!m.matches()) {
-            return new String[] { url, DEFAULT_VERSION };
-        }
-        else {
-            //System.err.println(m.groupCount());
-            //for (int i = 1; i <= m.groupCount(); i++) {
-            //    System.err.println("Group " + i + ": " + m.group(i));
-            //}
-
-            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);
-            }
-        }
-    }
-
-    public static Set<String> analyze(Source source) throws Exception {
-        if (transformer == null) {
-            if (tf == null) {
-                tf = TransformerFactory.newInstance();
-            }
-            Source s = new StreamSource(SpringTransformer.class.getResourceAsStream("extract.xsl"));
-            transformer = tf.newTransformer(s);
-        }
-
-        Set<String> refers = new TreeSet<String>();
-
-        ByteArrayOutputStream bout = new ByteArrayOutputStream();
-        Result r = new StreamResult(bout);
-        transformer.transform(source, r);
-
-        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
-        bout.close();
-
-        BufferedReader br = new BufferedReader(new InputStreamReader(bin));
-
-        String line = br.readLine();
-        while (line != null) {
-            line = line.trim();
-            if (line.length() > 0) {
-                String parts[] = line.split("\\s*,\\s*");
-                for (int i = 0; i < parts.length; i++) {
-                    int n = parts[i].lastIndexOf('.');
-                    if (n > 0) {
-                        String pkg = parts[i].substring(0, n);
-                        if (!pkg.startsWith("java.")) {
-                            refers.add(parts[i].substring(0, n));
-                        }
-                    }
-                }
-            }
-            line = br.readLine();
-        }
-        br.close();
-        return refers;
-    }
-
-    protected static String getImportPackages(Set<String> packages) {
-        StringBuilder sb = new StringBuilder();
-        for (String pkg : packages) {
-            if (sb.length() > 0) {
-                sb.append(",");
-            }
-            sb.append(pkg);
-        }
-        return sb.toString();
-    }
-
-    protected static Document parse(URL url) throws Exception {
-        if (dbf == null) {
-            dbf = DocumentBuilderFactory.newInstance();
-            dbf.setNamespaceAware(true);
-        }
-        DocumentBuilder db = dbf.newDocumentBuilder();
-        return db.parse(url.toString());
-    }
-
-    protected static void copyInputStream(InputStream in, OutputStream out) throws Exception {
-        byte[] buffer = new byte[4096];
-        int len = in.read(buffer);
-        while (len >= 0) {
-            out.write(buffer, 0, len);
-            len = in.read(buffer);
-        }
-    }
-}
diff --git a/karaf/deployer/spring/src/main/java/org/apache/felix/karaf/deployer/spring/SpringURLHandler.java b/karaf/deployer/spring/src/main/java/org/apache/felix/karaf/deployer/spring/SpringURLHandler.java
deleted file mode 100644
index 0124d38..0000000
--- a/karaf/deployer/spring/src/main/java/org/apache/felix/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.felix.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.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.osgi.service.url.AbstractURLStreamHandlerService;
-
-/**
- * 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 static Log logger = LogFactory.getLog(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/deployer/spring/src/main/resources/OSGI-INF/blueprint/spring-deployer.xml b/karaf/deployer/spring/src/main/resources/OSGI-INF/blueprint/spring-deployer.xml
deleted file mode 100644
index 278584f..0000000
--- a/karaf/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">
-
-    <service id="springUrlHandler" interface="org.osgi.service.url.URLStreamHandlerService">
-    	<service-properties>
-            <entry key="url.handler.protocol" value="spring"/>
-        </service-properties>
-        <bean class="org.apache.felix.karaf.deployer.spring.SpringURLHandler"/>
-    </service>
-
-    <bean id="springDeploymentListener" class="org.apache.felix.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/deployer/spring/src/main/resources/org/apache/felix/karaf/deployer/spring/extract.xsl b/karaf/deployer/spring/src/main/resources/org/apache/felix/karaf/deployer/spring/extract.xsl
deleted file mode 100644
index 4b06b69..0000000
--- a/karaf/deployer/spring/src/main/resources/org/apache/felix/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/deployer/spring/src/test/java/org/apache/felix/karaf/deployer/spring/SpringDeploymentListenerTest.java b/karaf/deployer/spring/src/test/java/org/apache/felix/karaf/deployer/spring/SpringDeploymentListenerTest.java
deleted file mode 100644
index d74e471..0000000
--- a/karaf/deployer/spring/src/test/java/org/apache/felix/karaf/deployer/spring/SpringDeploymentListenerTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.felix.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;
-import org.apache.felix.karaf.deployer.spring.SpringDeploymentListener;
-import org.apache.felix.karaf.deployer.spring.SpringTransformer;
-
-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.felix.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();
-        }
-    }
-
-    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 = SpringTransformer.extractNameVersionType(s);
-        assertEquals(expectedParts.length, parts.length);
-        for (int i = 0; i < expectedParts.length; i++) {
-            assertEquals(expectedParts[i], parts[i]);
-        }
-    }
-
-}
diff --git a/karaf/deployer/spring/src/test/resources/test.xml b/karaf/deployer/spring/src/test/resources/test.xml
deleted file mode 100644
index 0b6ea23..0000000
--- a/karaf/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>
-        RequireBundle=org.osgi
-        Header=value
-    </manifest>
-
-    <bean id="springDeploymentListener" class="org.apache.felix.karaf.deployer.spring.SpringDeploymentListener">
-
-    </bean>
-
-    <osgi:service ref="springDeploymentListener">
-        <osgi:interfaces>
-            <value>org.apache.felix.karaf.deployer.filemonitor.DeploymentListener</value>
-        </osgi:interfaces>
-    </osgi:service>
-
-    <bean id="springHandler" class="org.apache.felix.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/deployer/war/pom.xml b/karaf/deployer/war/pom.xml
deleted file mode 100644
index 2772469..0000000
--- a/karaf/deployer/war/pom.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.deployer</groupId>
-        <artifactId>deployer</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.deployer</groupId>
-    <artifactId>org.apache.felix.karaf.deployer.war</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: WAR Deployer</name>
-
-    <description>This deployer transforms a plain war file to a deployable bundle</description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.fileinstall</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <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>!${project.artifactId}*,*</Import-Package>
-                        <Private-Package>org.apache.felix.karaf.deployer.war</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf/deployer/war/src/main/java/org/apache/felix/karaf/deployer/war/WarDeploymentListener.java b/karaf/deployer/war/src/main/java/org/apache/felix/karaf/deployer/war/WarDeploymentListener.java
deleted file mode 100644
index 855c49c..0000000
--- a/karaf/deployer/war/src/main/java/org/apache/felix/karaf/deployer/war/WarDeploymentListener.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.felix.karaf.deployer.war;
-
-import java.io.File;
-import java.net.URL;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.felix.fileinstall.ArtifactUrlTransformer;
-
-/**
- * A deployment listener that listens for war deployements.
- */
-public class WarDeploymentListener implements ArtifactUrlTransformer {
-
-    private static final Log LOGGER = LogFactory.getLog(WarDeploymentListener.class);
-
-    public boolean canHandle(File artifact) {
-        try {
-            JarFile jar = new JarFile(artifact);
-            JarEntry entry = jar.getJarEntry("WEB-INF/web.xml");
-            // Only handle WAR artifacts
-            if (entry == null) {
-                return false;
-            }
-            // Only handle non OSGi bundles
-            Manifest m = jar.getManifest();
-            if (m.getMainAttributes().getValue(new Attributes.Name("Bundle-SymbolicName")) != null &&
-                m.getMainAttributes().getValue(new Attributes.Name("Bundle-Version")) != null) {
-                return false;
-            }
-            return true;
-        } catch (Exception e) {
-            return false;
-        }
-    }
-
-    public URL transform(URL artifact) throws Exception {
-        try {
-            return new URL("war", null, artifact.toString());
-        } catch (Exception e) {
-            LOGGER.error("Unable to build war bundle", e);
-            return null;
-        }
-    }
-
-}
diff --git a/karaf/deployer/war/src/main/resources/OSGI-INF/blueprint/war-deployer.xml b/karaf/deployer/war/src/main/resources/OSGI-INF/blueprint/war-deployer.xml
deleted file mode 100644
index b1a2766..0000000
--- a/karaf/deployer/war/src/main/resources/OSGI-INF/blueprint/war-deployer.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">
-
-    <bean id="warDeploymentListener" class="org.apache.felix.karaf.deployer.war.WarDeploymentListener"/>
-
-    <reference id="warUrlHandlerRef" interface="org.osgi.service.url.URLStreamHandlerService" filter="url.handler.protocol=war" />
-
-    <service ref="warDeploymentListener" auto-export="interfaces" depends-on="warDeploymentListener" />
-
-</blueprint>
diff --git a/karaf/etc/appended-resources/supplemental-models.xml b/karaf/etc/appended-resources/supplemental-models.xml
deleted file mode 100644
index 2f96e29..0000000
--- a/karaf/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.geronimo.specs</groupId>
-      <artifactId>geronimo-activation_1.1_spec</artifactId>
-      <name>Apache Geronimo 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/exception/pom.xml b/karaf/exception/pom.xml
deleted file mode 100644
index ab8e367..0000000
--- a/karaf/exception/pom.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf</groupId>
-    <artifactId>org.apache.felix.karaf.exception</artifactId>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Exception</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-</project>
diff --git a/karaf/exception/src/main/java/java/lang/Exception.java b/karaf/exception/src/main/java/java/lang/Exception.java
deleted file mode 100644
index 1aff70e..0000000
--- a/karaf/exception/src/main/java/java/lang/Exception.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES 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 = sm.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 final SecurityManagerEx sm = new SecurityManagerEx();
-
-    static class SecurityManagerEx extends SecurityManager
-    {
-        public Class[] getClassContext()
-        {
-            return super.getClassContext();
-        }
-
-        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;
-            }
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/karaf/features/command/NOTICE b/karaf/features/command/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/features/command/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/features/command/pom.xml b/karaf/features/command/pom.xml
deleted file mode 100644
index 2eb726c..0000000
--- a/karaf/features/command/pom.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.features</groupId>
-        <artifactId>features</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.features</groupId>
-    <artifactId>org.apache.felix.karaf.features.command</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Features Command</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.features</groupId>
-            <artifactId>org.apache.felix.karaf.features.core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.bundlerepository</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.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>
-        <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>
-                            !${project.artifactId}*,
-                            javax.management,
-                            javax.management.loading,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>!*</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/AddUrlCommand.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/AddUrlCommand.java
deleted file mode 100644
index 237ac50..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/AddUrlCommand.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.felix.karaf.features.command;
-
-import java.net.URI;
-import java.util.List;
-
-import org.apache.felix.karaf.features.FeaturesService;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "features", name = "addUrl", description = "Adds a list of repository URLs to the features service.")
-public class AddUrlCommand extends FeaturesCommandSupport {
-
-    @Argument(index = 0, name = "urls", description = "One or more repository URLs separated by whitespaces", required = true, multiValued = true)
-    List<String> urls;
-
-    protected void doExecute(FeaturesService admin) throws Exception {
-        for (String url : urls) {
-            try {
-                admin.addRepository(new URI(url));
-            } catch (Exception e) {
-                System.out.println("Could not add Feature Repository:\n" + e );  
-            }
-        }
-    }
-}
diff --git a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/FeaturesCommandSupport.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/FeaturesCommandSupport.java
deleted file mode 100644
index 1ba61ad..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/FeaturesCommandSupport.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.felix.karaf.features.command;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.karaf.features.FeaturesService;
-import org.osgi.framework.ServiceReference;
-
-public abstract class FeaturesCommandSupport extends OsgiCommandSupport {
-
-    protected Object doExecute() throws Exception {
-        // Get repository admin service.
-        ServiceReference ref = getBundleContext().getServiceReference(FeaturesService.class.getName());
-        if (ref == null) {
-            System.out.println("FeaturesService service is unavailable.");
-            return null;
-        }
-        try {
-            FeaturesService admin = (FeaturesService) getBundleContext().getService(ref);
-            if (admin == null) {
-                System.out.println("FeaturesService service is unavailable.");
-                return null;
-            }
-
-            doExecute(admin);
-        }
-        finally {
-            getBundleContext().ungetService(ref);
-        }
-        return null;
-    }
-
-    protected abstract void doExecute(FeaturesService admin) throws Exception;
-
-}
diff --git a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/InfoFeatureCommand.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/InfoFeatureCommand.java
deleted file mode 100644
index 9418c75..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/InfoFeatureCommand.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.felix.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.felix.karaf.features.Feature;
-import org.apache.felix.karaf.features.FeaturesService;
-
-/**
- * Utility command to display info about features.
- */
-@Command(scope = "features", name = "info", description = "Shows information about selected information.")
-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 (config) {
-            displayConfigInformation(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<String> bundles = feature.getBundles();
-        if (bundles.isEmpty()) {
-            System.out.println("Feature has no bundles.");
-        } else {
-            System.out.println("Feature contains followed bundles:");
-            for (String featureBundle : bundles) {
-                System.out.println("  " + featureBundle);
-            }
-        }
-    }
-
-    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 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<String> 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));
-            }
-        }
-        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/features/command/src/main/java/org/apache/felix/karaf/features/command/InstallFeatureCommand.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/InstallFeatureCommand.java
deleted file mode 100644
index 45f7897..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/InstallFeatureCommand.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.karaf.features.command;
-
-import java.util.EnumSet;
-
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.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 = "name", description = "The name of the feature", required = true, multiValued = false)
-    String name;
-    @Argument(index = 1, name = "version", description = "The version of the feature", required = false, multiValued = false)
-    String version;
-    @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;
-
-    protected void doExecute(FeaturesService admin) throws Exception {
-    	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);
-        }
-        admin.installFeature(name, version, options);
-    }
-}
diff --git a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/ListFeaturesCommand.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/ListFeaturesCommand.java
deleted file mode 100644
index ebdeb06..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/ListFeaturesCommand.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.features.command;
-
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.felix.karaf.features.FeaturesService;
-import org.apache.felix.karaf.features.Feature;
-import org.apache.felix.karaf.features.Repository;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "features", name = "list", description = "Lists all existing features available from the defined repositories.")
-public class ListFeaturesCommand extends FeaturesCommandSupport {
-
-    @Option(name = "-i", aliases={"--installed"}, description="Display a list of all installed features only", required = false, multiValued = false)
-    boolean installed;
-
-    private static final String STATE = "State";
-    private static final String INSTALLED = "installed  ";
-    private static final String UNINSTALLED = "uninstalled";
-
-    private static final String VERSION = "Version";
-    private static final String NAME = "Name";
-    private static final String REPOSITORY = "Repository";
-
-    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());
-        }
-        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);
-        System.out.println(sb.toString());
-
-        // Print the feature data.
-        boolean needsLegend = false;
-        for (Feature f : features) {
-
-            sb.setLength(0);
-            sb.append("[");
-            if (admin.isInstalled(f)) {
-                sb.append(INSTALLED);
-            } else {
-                sb.append(UNINSTALLED);
-            }
-
-            sb.append("] [");
-            String str = f.getVersion();
-            sb.append(str);
-            for (int i = str.length(); i < maxVersionSize; i++) {
-                sb.append(" ");
-            }
-            sb.append("] ");
-
-            str = f.getName();
-            sb.append(str);
-            for (int i = str.length(); i < maxNameSize; i++) {
-                sb.append(" ");
-            }
-
-            sb.append(" ");
-            String name = repositories.get(0).getName();
-            sb.append(name);
-            repositories.remove(0);
-            System.out.println(sb.toString());
-            if (name.charAt(name.length() - 1) == '*') {
-                needsLegend = true;
-            }
-
-        }
-
-        if (needsLegend) {
-            System.out.println("* Installed via deploy directory");
-        }
-
-    }
-
-}
diff --git a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/ListUrlCommand.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/ListUrlCommand.java
deleted file mode 100644
index 79b280b..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/ListUrlCommand.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.felix.karaf.features.command;
-
-import org.apache.felix.karaf.features.FeaturesService;
-import org.apache.felix.karaf.features.Repository;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "features", name = "listUrl", description = "Displays a list of all defined repository URLs.")
-public class ListUrlCommand extends FeaturesCommandSupport {
-
-    protected void doExecute(FeaturesService admin) throws Exception {
-        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/features/command/src/main/java/org/apache/felix/karaf/features/command/RefreshUrlCommand.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/RefreshUrlCommand.java
deleted file mode 100644
index de67840..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/RefreshUrlCommand.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.felix.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.felix.karaf.features.FeaturesService;
-import org.apache.felix.karaf.features.Repository;
-
-@Command(scope = "features", name = "refreshUrl", description = "Reloads the list of available features from the repositories.")
-public class RefreshUrlCommand extends FeaturesCommandSupport {
-
-    @Argument(index = 0, name = "urls", description = "Repository URLs to reload (leave empty for all)", required = false, multiValued = true)
-    List<String> urls;
-
-    protected void doExecute(FeaturesService admin) throws Exception {
-        if (urls == null || urls.isEmpty()) {
-            urls = new ArrayList<String>();
-            for (Repository repo : admin.listRepositories()) {
-                urls.add(repo.getURI().toString());
-            }
-        }
-        for (String strUri : urls) {
-            try {
-                URI uri = new URI(strUri);
-                admin.removeRepository(uri);
-                admin.addRepository(uri);
-            } catch (Exception e) {
-                System.out.println("Could not refresh Feature Repository:\n" + e.getMessage() );
-            }
-        }
-    }
-}
diff --git a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/RemoveUrlCommand.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/RemoveUrlCommand.java
deleted file mode 100644
index c5cfed1..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/RemoveUrlCommand.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.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.karaf.features.FeaturesService;
-
-@Command(scope = "features", name = "removeUrl", description = "Removes the given list of repository URLs from the features service.")
-public class RemoveUrlCommand extends FeaturesCommandSupport {
-
-    @Argument(index = 0, name = "urls", description = "One or more repository URLs separated by whitespaces", required = true, multiValued = true)
-    List<String> urls;
-
-    protected void doExecute(FeaturesService admin) throws Exception {
-        for (String url : urls) {
-            admin.removeRepository(new URI(url));
-        }
-    }
-}
diff --git a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/UninstallFeatureCommand.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/UninstallFeatureCommand.java
deleted file mode 100644
index 4906d78..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/UninstallFeatureCommand.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.felix.karaf.features.command;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.karaf.features.FeaturesService;
-
-@Command(scope = "features", name = "uninstall", description = "Uninstalls a feature with the specified name and version.")
-public class UninstallFeatureCommand extends FeaturesCommandSupport {
-
-    @Argument(index = 0, name = "name", description = "The name of the feature", required = true, multiValued = false)
-    String name;
-    
-    @Argument(index = 1, name = "version", description = "The version of the feature", required = false, multiValued = false)
-    String version;
-
-    protected void doExecute(FeaturesService admin) throws Exception {
-    	if (version != null && version.length() > 0) {
-    		admin.uninstallFeature(name, version);
-    	} else {
-    		admin.uninstallFeature(name );
-    	}
-    }
-}
diff --git a/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/completers/AllFeatureCompleter.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/completers/AllFeatureCompleter.java
deleted file mode 100644
index 2b42bcc..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/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.felix.karaf.features.command.completers;
-
-import org.apache.felix.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/features/command/src/main/java/org/apache/felix/karaf/features/command/completers/AvailableFeatureCompleter.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/completers/AvailableFeatureCompleter.java
deleted file mode 100644
index ae0b9a6..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/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.felix.karaf.features.command.completers;
-
-import org.apache.felix.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/features/command/src/main/java/org/apache/felix/karaf/features/command/completers/FeatureCompleterSupport.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/completers/FeatureCompleterSupport.java
deleted file mode 100644
index 430f8b1..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/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.felix.karaf.features.command.completers;
-
-import java.util.List;
-
-import org.apache.felix.karaf.features.Feature;
-import org.apache.felix.karaf.features.FeaturesService;
-import org.apache.felix.karaf.shell.console.Completer;
-import org.apache.felix.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/features/command/src/main/java/org/apache/felix/karaf/features/command/completers/FeatureRepositoryCompleter.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/completers/FeatureRepositoryCompleter.java
deleted file mode 100644
index a9b9d7b..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/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.felix.karaf.features.command.completers;
-
-import java.util.List;
-
-import org.apache.felix.karaf.shell.console.completer.StringsCompleter;
-import org.apache.felix.karaf.shell.console.Completer;
-import org.apache.felix.karaf.features.FeaturesService;
-import org.apache.felix.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/features/command/src/main/java/org/apache/felix/karaf/features/command/completers/InstalledFeatureCompleter.java b/karaf/features/command/src/main/java/org/apache/felix/karaf/features/command/completers/InstalledFeatureCompleter.java
deleted file mode 100644
index 07b7b73..0000000
--- a/karaf/features/command/src/main/java/org/apache/felix/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.felix.karaf.features.command.completers;
-
-import org.apache.felix.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/features/command/src/main/resources/OSGI-INF/blueprint/features-command.xml b/karaf/features/command/src/main/resources/OSGI-INF/blueprint/features-command.xml
deleted file mode 100644
index d9b3f8c..0000000
--- a/karaf/features/command/src/main/resources/OSGI-INF/blueprint/features-command.xml
+++ /dev/null
@@ -1,80 +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">
-
-    <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="features/addUrl">
-            <action class="org.apache.felix.karaf.features.command.AddUrlCommand"/>
-        </command>
-        <command name="features/listUrl">
-            <action class="org.apache.felix.karaf.features.command.ListUrlCommand"/>
-        </command>
-        <command name="features/removeUrl">
-            <action class="org.apache.felix.karaf.features.command.RemoveUrlCommand"/>
-            <completers>
-                <ref component-id="removeUrlCompleter" />
-            </completers>
-        </command>
-        <command name="features/refreshUrl">
-            <action class="org.apache.felix.karaf.features.command.RefreshUrlCommand"/>
-        </command>
-        <command name="features/install">
-            <action class="org.apache.felix.karaf.features.command.InstallFeatureCommand"/>
-            <completers>
-                <ref component-id="uninstalledFeatureCompleter" />
-            </completers>
-        </command>
-        <command name="features/uninstall">
-            <action class="org.apache.felix.karaf.features.command.UninstallFeatureCommand"/>
-            <completers>
-                <ref component-id="installedFeatureCompleter" />
-            </completers>
-        </command>
-        <command name="features/list">
-            <action class="org.apache.felix.karaf.features.command.ListFeaturesCommand"/>
-        </command>
-        <command name="features/info">
-            <action class="org.apache.felix.karaf.features.command.InfoFeatureCommand"/>
-            <completers>
-                <ref component-id="allFeatureCompleter" />
-            </completers>
-        </command>
-    </command-bundle>
-
-    <reference id="featuresService" interface="org.apache.felix.karaf.features.FeaturesService" />
-
-    <bean id="uninstalledFeatureCompleter" class="org.apache.felix.karaf.features.command.completers.AvailableFeatureCompleter">
-        <property name="featuresService" ref="featuresService" />
-    </bean>
-
-    <bean id="installedFeatureCompleter" class="org.apache.felix.karaf.features.command.completers.InstalledFeatureCompleter">
-        <property name="featuresService" ref="featuresService" />
-    </bean>
-
-    <bean id="allFeatureCompleter" class="org.apache.felix.karaf.features.command.completers.AllFeatureCompleter">
-        <property name="featuresService" ref="featuresService" />
-    </bean>
-
-    <bean id="removeUrlCompleter" class="org.apache.felix.karaf.features.command.completers.FeatureRepositoryCompleter">
-        <property name="featuresService" ref="featuresService" />
-    </bean>
-
-</blueprint>
diff --git a/karaf/features/core/NOTICE b/karaf/features/core/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/features/core/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/features/core/pom.xml b/karaf/features/core/pom.xml
deleted file mode 100644
index c6fe665..0000000
--- a/karaf/features/core/pom.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.features</groupId>
-        <artifactId>features</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.features</groupId>
-    <artifactId>org.apache.felix.karaf.features.core</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Features Core</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.utils</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.bundlerepository</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.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>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Export-Package>org.apache.felix.karaf.features;version=${project.version}</Export-Package>
-                        <Import-Package>
-                            !org.apache.felix.karaf.features,
-                            javax.management,
-                            javax.management.loading,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>
-                            org.apache.felix.karaf.features.internal,
-                            org.apache.felix.utils.version,
-                            org.apache.felix.utils.manifest
-                        </Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/Feature.java b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/Feature.java
deleted file mode 100644
index 6fc7f23..0000000
--- a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/Feature.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.felix.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 {
-
-    String getId();
-
-    String getName();
-
-    String getVersion();
-
-    List<Feature> getDependencies();
-
-    List<String> getBundles();
-
-    Map<String, Map<String, String>> getConfigurations();
-
-}
diff --git a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/FeatureEvent.java b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/FeatureEvent.java
deleted file mode 100644
index f368ff8..0000000
--- a/karaf/features/core/src/main/java/org/apache/felix/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.felix.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/features/core/src/main/java/org/apache/felix/karaf/features/FeaturesListener.java b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/FeaturesListener.java
deleted file mode 100644
index 1b54ed9..0000000
--- a/karaf/features/core/src/main/java/org/apache/felix/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.felix.karaf.features;
-
-public interface FeaturesListener {
-
-    void featureEvent(FeatureEvent event);
-
-    void repositoryEvent(RepositoryEvent event);
-
-}
diff --git a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/FeaturesService.java b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/FeaturesService.java
deleted file mode 100644
index 1e248e7..0000000
--- a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/FeaturesService.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.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
-    }
-
-    void addRepository(URI url) throws Exception;
-
-    void removeRepository(URI url);
-
-    Repository[] listRepositories();
-
-    void installFeature(String name) throws Exception;
-    
-    void installFeature(String name, String version) throws Exception;
-
-    void installFeature(String name, String version, EnumSet<Option> options) throws Exception;
-
-    void installFeature(Feature f, EnumSet<Option> options) throws Exception;
-
-    void installFeatures(Set<Feature> features, EnumSet<Option> options) throws Exception;
-
-    void uninstallFeature(String name) throws Exception;
-    
-    void uninstallFeature(String name, String version) throws Exception;
-
-    Feature[] listFeatures() throws Exception;
-
-    Feature[] listInstalledFeatures();
-
-    boolean isInstalled(Feature f);
-
-    Feature getFeature(String name, String version) throws Exception;
-
-    Feature getFeature(String name) throws Exception;
-}
diff --git a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/Repository.java b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/Repository.java
deleted file mode 100644
index a098825..0000000
--- a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/Repository.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.felix.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;
-
-}
diff --git a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/RepositoryEvent.java b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/RepositoryEvent.java
deleted file mode 100644
index f62076a..0000000
--- a/karaf/features/core/src/main/java/org/apache/felix/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.felix.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;
-    }
-}
\ No newline at end of file
diff --git a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeatureImpl.java b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeatureImpl.java
deleted file mode 100644
index 0ae7c6b..0000000
--- a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeatureImpl.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.felix.karaf.features.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.felix.karaf.features.Feature;
-
-/**
- * A feature
- */
-public class FeatureImpl implements Feature {
-
-    private String id;
-    private String name;
-    private String version;
-    private List<Feature> dependencies = new ArrayList<Feature>();
-    private List<String> bundles = new ArrayList<String>();
-    private Map<String, Map<String,String>> configs = new HashMap<String, Map<String,String>>();
-    public static String SPLIT_FOR_NAME_AND_VERSION = "_split_for_name_and_version_";
-    public static String DEFAULT_VERSION = "0.0.0";
-    
-    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 getVersion() {
-		return version;
-	}
-    
-	public void setVersion(String version) {
-		this.version = version;
-	}
-
-    public List<Feature> getDependencies() {
-        return dependencies;
-    }
-
-    public List<String> getBundles() {
-        return bundles;
-    }
-
-    public Map<String, Map<String, String>> getConfigurations() {
-        return configs;
-    }
-
-    public void addDependency(Feature 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 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/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java
deleted file mode 100644
index df9b77c..0000000
--- a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java
+++ /dev/null
@@ -1,963 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.features.internal;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.*;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.jar.JarInputStream;
-import java.util.jar.Manifest;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.felix.karaf.features.Feature;
-import org.apache.felix.karaf.features.FeatureEvent;
-import org.apache.felix.karaf.features.FeaturesListener;
-import org.apache.felix.karaf.features.FeaturesService;
-import org.apache.felix.karaf.features.Repository;
-import org.apache.felix.karaf.features.RepositoryEvent;
-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.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.Constants;
-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.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
-import org.osgi.service.prefs.PreferencesService;
-import org.osgi.service.startlevel.StartLevel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.slf4j.helpers.MessageFormatter;
-
-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 {
-
-    public static final String CONFIG_KEY = "org.apache.felix.karaf.features.configKey";
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(FeaturesServiceImpl.class);
-
-    private BundleContext bundleContext;
-    private ConfigurationAdmin configAdmin;
-    private PackageAdmin packageAdmin;
-    private StartLevel startLevel;
-    private PreferencesService preferences;
-    private Set<URI> uris;
-    private Map<URI, RepositoryImpl> repositories = new HashMap<URI, RepositoryImpl>();
-    private Map<String, Map<String, Feature>> features;
-    private Map<Feature, Set<Long>> installed = new HashMap<Feature, Set<Long>>();
-    private String boot;
-    private boolean bootFeaturesInstalled;
-    private List<FeaturesListener> listeners = new CopyOnWriteArrayList<FeaturesListener>();
-
-    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 PreferencesService getPreferences() {
-        return preferences;
-    }
-
-    public void setPreferences(PreferencesService preferences) {
-        this.preferences = preferences;
-    }
-
-    public StartLevel getStartLevel() {
-        return startLevel;
-    }
-
-    public void setStartLevel(StartLevel startLevel) {
-        this.startLevel = startLevel;
-    }
-
-    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;
-    }
-
-    public void addRepository(URI uri) throws Exception {
-        if (!repositories.containsKey(uri)) {
-            internalAddRepository(uri);
-            saveState();
-        }
-    }
-
-    protected RepositoryImpl internalAddRepository(URI uri) throws Exception {
-    	RepositoryImpl repo = null;
-        repo = new RepositoryImpl(uri);
-        repo.load();
-        repositories.put(uri, repo);
-        callListeners(new RepositoryEvent(repo, RepositoryEvent.EventType.RepositoryAdded, false));
-        features = null;
-        return repo;
-        
-    }
-
-    public void removeRepository(URI uri) {
-        if (repositories.containsKey(uri)) {
-            internalRemoveRepository(uri);
-            saveState();
-        }
-    }
-
-    public void internalRemoveRepository(URI uri) {
-        Repository repo = repositories.remove(uri);
-        callListeners(new RepositoryEvent(repo, RepositoryEvent.EventType.RepositoryRemoved, false));
-        features = null;
-    }
-
-    public Repository[] listRepositories() {
-        Collection<RepositoryImpl> repos = repositories.values();
-        return repos.toArray(new Repository[repos.size()]);
-    }
-
-    public void installAllFeatures(URI uri) throws Exception {
-        RepositoryImpl repo = internalAddRepository(uri);
-        for (Feature f : repo.getFeatures()) {
-            installFeature(f.getName(), f.getVersion());
-        }
-        internalRemoveRepository(uri);            
-    }
-
-    public void uninstallAllFeatures(URI uri) throws Exception {
-        RepositoryImpl repo = internalAddRepository(uri);
-        for (Feature f : repo.getFeatures()) {
-            uninstallFeature(f.getName(), f.getVersion());
-        }
-        internalRemoveRepository(uri);            
-    }
-
-    public void installFeature(String name) throws Exception {
-    	installFeature(name, FeatureImpl.DEFAULT_VERSION);
-    }
-
-    public void installFeature(String name, String version) throws Exception {
-        installFeature(name, version, EnumSet.noneOf(Option.class));
-    }
-
-    public void installFeature(String name, String version, EnumSet<Option> options) throws Exception {
-        Feature f = getFeature(name, version);
-        if (f == null) {
-            throw new Exception("No feature named '" + name
-            		+ "' with version '" + version + "' available");
-        }
-        installFeature(f, options);
-    }
-
-    public void installFeature(Feature f, EnumSet<Option> options) throws Exception {
-        installFeatures(Collections.singleton(f), options);
-    }
-
-    public void installFeatures(Set<Feature> features, EnumSet<Option> options) throws Exception {
-        InstallationState state = new InstallationState();
-        InstallationState failure = new InstallationState();
-        try {
-            // Install everything
-            for (Feature f : features) {
-                InstallationState s = new InstallationState();
-            	try {
-                    doInstallFeature(s, f);
-                    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.info("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.info("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.info("Refreshing bundles: {}", sb.toString());
-                        getPackageAdmin().refreshPackages(bundlesToRefresh.toArray(new Bundle[bundlesToRefresh.size()]));
-                    }
-                }
-            }
-            // Start all bundles
-            for (Bundle b : state.bundles) {
-                // do not start fragment bundles
-                Dictionary d = b.getHeaders();
-                String fragmentHostHeader = (String) d.get(Constants.FRAGMENT_HOST);
-                if (fragmentHostHeader == null || fragmentHostHeader.trim().length() == 0) {
-                    // do not start bundles that are persistently stopped
-                    if (state.installed.contains(b)
-                            || (b.getState() != Bundle.STARTING && b.getState() != Bundle.ACTIVE
-                                    && getStartLevel().isBundlePersistentlyStarted(b))) {
-                        try {
-                            b.start();
-                        } catch (BundleException be) {
-                            String[] msgdata = new String[]{
-                                b.getLocation(),
-                                getFeaturesContainingBundleList(b),
-                                be.getMessage()
-                            };
-                            String msg = MessageFormatter.arrayFormat("Could not start bundle {} in feature(s) {}: {}", msgdata);
-                            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<Feature, Set<Long>> features = new HashMap<Feature, Set<Long>>();
-    }
-
-    protected void doInstallFeature(InstallationState state, Feature feature) throws Exception {
-        for (Feature dependency : feature.getDependencies()) {
-            Feature f = getFeature(dependency.getName(), dependency.getVersion());
-            if (f == null) {
-                throw new Exception("No feature named '" + dependency.getName()
-                        + "' with version '" + dependency.getVersion() + "' available");
-            }
-        	doInstallFeature(state, f);
-        }
-        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 = (pid[1] == null ? pid[0] : pid[0] + "-" + pid[1]);
-                props.put(CONFIG_KEY, key);
-                if (cfg.getBundleLocation() != null) {
-                    cfg.setBundleLocation(null);
-                }
-                cfg.update(props);
-            }
-        }
-        Set<Long> bundles = new TreeSet<Long>();
-        for (String bundleLocation : feature.getBundles()) {
-            Bundle b = installBundleIfNeeded(state, bundleLocation);
-            bundles.add(b.getBundleId());
-        }
-        state.features.put(feature, bundles);
-    }
-
-    protected Set<Bundle> findBundlesToRefresh(InstallationState state) {
-        Set<Bundle> bundles = new HashSet<Bundle>();
-        bundles.addAll(findBundlesWithOptionalPackagesToRefresh(state));
-        bundles.addAll(findBundlesWithFramentsToRefresh(state));
-        return bundles;
-    }
-
-    protected Set<Bundle> findBundlesWithFramentsToRefresh(InstallationState state) {
-        Set<Bundle> bundles = new HashSet<Bundle>();
-        Set<Bundle> oldBundles = new HashSet<Bundle>(state.bundles);
-        oldBundles.removeAll(state.installed);
-        if (!oldBundles.isEmpty()) {
-            for (Bundle b : state.installed) {
-                String hostHeader = (String) b.getHeaders().get(Constants.FRAGMENT_HOST);
-                if (hostHeader != null) {
-                    Clause[] clauses = Parser.parseHeader(hostHeader);
-                    if (clauses != null && clauses.length > 0) {
-                        Clause path = clauses[0];
-                        for (Bundle hostBundle : oldBundles) {
-                            if (hostBundle.getSymbolicName().equals(path.getName())) {
-                                String ver = path.getAttribute(Constants.BUNDLE_VERSION_ATTRIBUTE);
-                                if (ver != null) {
-                                    VersionRange v = VersionRange.parseVersionRange(ver);
-                                    if (v.contains(hostBundle.getVersion())) {
-                                        bundles.add(hostBundle);
-                                    }
-                                } else {
-                                    bundles.add(hostBundle);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return bundles;
-    }
-
-    protected Set<Bundle> findBundlesWithOptionalPackagesToRefresh(InstallationState state) {
-        // First pass: include all bundles contained in these features
-        Set<Bundle> bundles = new HashSet<Bundle>(state.bundles);
-        bundles.removeAll(state.installed);
-        if (bundles.isEmpty()) {
-            return bundles;
-        }
-        // Second pass: for each bundle, check if there is any unresolved optional package that could be resolved
-        Map<Bundle, List<Clause>> imports = new HashMap<Bundle, List<Clause>>();
-        for (Iterator<Bundle> it = bundles.iterator(); it.hasNext();) {
-            Bundle b = it.next();
-            String importsStr = (String) b.getHeaders().get(Constants.IMPORT_PACKAGE);
-            List<Clause> importsList = getOptionalImports(importsStr);
-            if (importsList.isEmpty()) {
-                it.remove();
-            } else {
-                imports.put(b, importsList);
-            }
-        }
-        if (bundles.isEmpty()) {
-            return bundles;
-        }
-        // Third pass: compute a list of packages that are exported by our bundles and see if
-        //             some exported packages can be wired to the optional imports
-        List<Clause> exports = new ArrayList<Clause>();
-        for (Bundle b : state.installed) {
-            String exportsStr = (String) b.getHeaders().get(Constants.EXPORT_PACKAGE);
-            if (exportsStr != null) {
-                Clause[] exportsList = Parser.parseHeader(exportsStr);
-                exports.addAll(Arrays.asList(exportsList));
-            }
-        }
-        for (Iterator<Bundle> it = bundles.iterator(); it.hasNext();) {
-            Bundle b = it.next();
-            List<Clause> importsList = imports.get(b);
-            for (Iterator<Clause> itpi = importsList.iterator(); itpi.hasNext();) {
-                Clause pi = itpi.next();
-                boolean matching = false;
-                for (Clause pe : exports) {
-                    if (pi.getName().equals(pe.getName())) {
-                        String evStr = pe.getAttribute(Constants.VERSION_ATTRIBUTE);
-                        String ivStr = pi.getAttribute(Constants.VERSION_ATTRIBUTE);
-                        Version exported = evStr != null ? Version.parseVersion(evStr) : Version.emptyVersion;
-                        VersionRange imported = ivStr != null ? VersionRange.parseVersionRange(ivStr) : VersionRange.ANY_VERSION;
-                        if (imported.contains(exported)) {
-                            matching = true;
-                            break;
-                        }
-                    }
-                }
-                if (!matching) {
-                    itpi.remove();
-                }
-            }
-            if (importsList.isEmpty()) {
-                it.remove();
-            } else {
-                LOGGER.debug("Refeshing bundle {} ({}) to solve the following optional imports", b.getSymbolicName(), b.getBundleId());
-                for (Clause p : importsList) {
-                    LOGGER.debug("    {}", p);
-                }
-
-            }
-        }
-        return bundles;
-    }
-
-    /*
-     * Get the list of optional imports from an OSGi Import-Package string
-     */
-    protected List<Clause> getOptionalImports(String importsStr) {
-        Clause[] imports = Parser.parseHeader(importsStr);
-        List<Clause> result = new LinkedList<Clause>();
-        for (int i = 0; i < imports.length; i++) {
-            String resolution = imports[i].getDirective(Constants.RESOLUTION_DIRECTIVE);
-            if (Constants.RESOLUTION_OPTIONAL.equals(resolution)) {
-                result.add(imports[i]);
-            }
-        }
-        return result;
-    }
-
-    protected Bundle installBundleIfNeeded(InstallationState state, String bundleLocation) throws IOException, BundleException {
-        LOGGER.debug("Checking " + bundleLocation);
-        InputStream is;
-        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();
-            String sn = m.getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME);
-            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);
-                        state.bundles.add(b);
-                        return b;
-                    }
-                }
-            }
-            try {
-                is.reset();
-            } catch (IOException e) {
-                is.close();
-                is = new BufferedInputStream(new URL(bundleLocation).openStream());
-            }
-            LOGGER.debug("Installing bundle " + bundleLocation);
-            Bundle b = getBundleContext().installBundle(bundleLocation, is);
-            state.bundles.add(b);
-            state.installed.add(b);
-            return b;
-        } finally {
-            is.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();
-            }
-        }
-        if (getPackageAdmin() != null) {
-            getPackageAdmin().refreshPackages(null);
-        }
-        callListeners(new FeatureEvent(feature, FeatureEvent.EventType.FeatureInstalled, 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 && 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;
-                    }
-                }
-            }
-            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 {
-        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();
-        }
-        if (boot != null && !bootFeaturesInstalled) {
-            new Thread() {
-                public void run() {
-                    String[] list = boot.split(",");
-                    Set<Feature> features = new LinkedHashSet<Feature>();
-                    for (String f : list) {
-                        if (f.length() > 0) {
-                            try {
-                                Feature feature = getFeature(f, FeatureImpl.DEFAULT_VERSION);
-                                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 {
-        uris = new HashSet<URI>(repositories.keySet());
-        while (!repositories.isEmpty()) {
-            internalRemoveRepository(repositories.keySet().iterator().next());
-        }
-    }
-
-    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 key = (factoryPid == null ? pid : pid + "-" + factoryPid);
-        String filter;
-        if (factoryPid == null) {
-            filter = "(" + Constants.SERVICE_PID + "=" + pid + ")";
-        } else {
-            filter = "(" + ConfigurationAdmin.SERVICE_FACTORYPID + "=" + factoryPid + ")";
-        }
-        Configuration[] configurations = configurationAdmin.listConfigurations(filter);
-        if (configurations != null && configurations.length > 0)
-        {
-            return configurations[0];
-        }
-        else
-        {
-            return null;
-        }
-    }
-    
-    protected void saveState() {
-        try {
-            Preferences prefs = preferences.getUserPreferences("FeaturesServiceState");
-            saveSet(prefs.node("repositories"), repositories.keySet());
-            saveMap(prefs.node("features"), installed);
-            prefs.putBoolean("bootFeaturesInstalled", bootFeaturesInstalled);
-            prefs.flush();
-        } catch (Exception e) {
-            LOGGER.error("Error persisting FeaturesService state", e);
-        }
-    }
-
-    protected boolean loadState() {
-        try {
-            Preferences prefs = preferences.getUserPreferences("FeaturesServiceState");
-            if (prefs.nodeExists("repositories")) {
-                Set<URI> repositories = loadSet(prefs.node("repositories"));
-                for (URI repo : repositories) {
-                    internalAddRepository(repo);
-                }
-                installed = loadMap(prefs.node("features"));
-                for (Feature f : installed.keySet()) {
-                    callListeners(new FeatureEvent(f, FeatureEvent.EventType.FeatureInstalled, true));
-                }
-                bootFeaturesInstalled = prefs.getBoolean("bootFeaturesInstalled", false);
-                return true;
-            }
-        } catch (Exception e) {
-            LOGGER.error("Error loading FeaturesService state", e);
-        }
-        return false;
-    }
-
-    protected void saveSet(Preferences node, Set<URI> set) throws BackingStoreException {
-        List<URI> l = new ArrayList<URI>(set);
-        node.clear();
-        node.putInt("count", l.size());
-        for (int i = 0; i < l.size(); i++) {
-            node.put("item." + i, l.get(i).toString());
-        }
-    }
-
-    protected Set<URI> loadSet(Preferences node) {
-        Set<URI> l = new HashSet<URI>();
-        int count = node.getInt("count", 0);
-        for (int i = 0; i < count; i++) {
-            l.add(URI.create(node.get("item." + i, null)));
-        }
-        return l;
-    }
-
-    protected void saveMap(Preferences node, Map<Feature, Set<Long>> map) throws BackingStoreException {
-        node.clear();
-        for (Map.Entry<Feature, Set<Long>> entry : map.entrySet()) {
-            Feature key = entry.getKey();
-            String val = createValue(entry.getValue());
-            node.put(key.toString(), val);
-        }
-    }
-
-    protected Map<Feature, Set<Long>> loadMap(Preferences node) throws BackingStoreException {
-        Map<Feature, Set<Long>> map = new HashMap<Feature, Set<Long>>();
-        for (String key : node.keys()) {
-            String val = node.get(key, null);
-            Set<Long> set = readValue(val);
-            map.put(FeatureImpl.valueOf(key), 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) {
-        for (FeaturesListener listener : listeners) {
-            listener.featureEvent(event);
-        }
-    }
-
-    protected void callListeners(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()) {
-                if (f.getBundles().contains(bundle.getLocation())) {
-                    features.add(f);
-                }
-            }
-        }
-        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/features/core/src/main/java/org/apache/felix/karaf/features/internal/RepositoryImpl.java b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/RepositoryImpl.java
deleted file mode 100644
index 374f3cf..0000000
--- a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/RepositoryImpl.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.felix.karaf.features.internal;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLConnection;
-import java.rmi.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-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.apache.felix.karaf.features.Repository;
-import org.apache.felix.karaf.features.Feature;
-import org.xml.sax.SAXException;
-
-/**
- * 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;
-
-    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 {
-            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());
-                        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");
-                    FeatureImpl f;
-                    if (version != null && version.length() > 0) {
-                        f = new FeatureImpl(name, version);
-                    } else {
-                        f = new FeatureImpl(name);
-                    }
-
-                    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 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);
-        } catch (IllegalArgumentException e) {
-            throw (IOException) new IOException(e.getMessage() + " : " + uri).initCause(e);
-        } catch (Exception e) {
-            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);
-        }
-    }
-
-}
diff --git a/karaf/features/core/src/main/resources/OSGI-INF/blueprint/gshell-features.xml b/karaf/features/core/src/main/resources/OSGI-INF/blueprint/gshell-features.xml
deleted file mode 100644
index 24480f4..0000000
--- a/karaf/features/core/src/main/resources/OSGI-INF/blueprint/gshell-features.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"
-           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:default-properties>
-        <ext:location>file:$(karaf.base)/etc/org.apache.felix.karaf.features.cfg</ext:location>
-    </ext:property-placeholder>
-
-    <bean id="featuresService" class="org.apache.felix.karaf.features.internal.FeaturesServiceImpl" init-method="start" destroy-method="stop">
-        <property name="urls" value="$[featuresRepositories]" />
-        <property name="boot" value="$[featuresBoot]" />
-        <property name="configAdmin" ref="configAdmin" />
-        <property name="packageAdmin" ref="packageAdmin" />
-        <property name="preferences" ref="preferences" />
-        <property name="startLevel" ref="startLevel" />
-        <property name="bundleContext" ref="blueprintBundleContext" />
-    </bean>
-
-    <reference-list id="featuresListeners" interface="org.apache.felix.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="preferences" interface="org.osgi.service.prefs.PreferencesService" availability="optional"/>
-
-    <reference id="packageAdmin" interface="org.osgi.service.packageadmin.PackageAdmin" />
-
-    <reference id="startLevel" interface="org.osgi.service.startlevel.StartLevel" />
-    
-    <service ref="featuresService" interface="org.apache.felix.karaf.features.FeaturesService" />
-
-</blueprint>
diff --git a/karaf/features/core/src/test/java/org/apache/felix/karaf/features/FeatureTest.java b/karaf/features/core/src/test/java/org/apache/felix/karaf/features/FeatureTest.java
deleted file mode 100644
index bd88118..0000000
--- a/karaf/features/core/src/test/java/org/apache/felix/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.felix.karaf.features;
-
-import junit.framework.TestCase;
-import org.apache.felix.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/features/core/src/test/java/org/apache/felix/karaf/features/FeaturesServiceTest.java b/karaf/features/core/src/test/java/org/apache/felix/karaf/features/FeaturesServiceTest.java
deleted file mode 100644
index 2cbaa54..0000000
--- a/karaf/features/core/src/test/java/org/apache/felix/karaf/features/FeaturesServiceTest.java
+++ /dev/null
@@ -1,1083 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.features;
-
-import java.io.File;
-import java.io.FileWriter;
-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.felix.karaf.features.internal.FeatureImpl;
-import org.apache.felix.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.packageadmin.PackageAdmin;
-import org.osgi.service.prefs.Preferences;
-import org.osgi.service.prefs.PreferencesService;
-
-import static org.easymock.EasyMock.*;
-
-public class FeaturesServiceTest extends TestCase {
-
-    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>");
-        pw.println("  <feature name=\"f1\">");
-        pw.println("    <bundle>" + name + "</bundle>");
-        pw.println("  </feature>");
-        pw.println("</features>");
-        pw.close();
-
-        URI uri = tmp.toURI();
-
-        Preferences prefs = EasyMock.createMock(Preferences.class);
-        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
-        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
-        Preferences featuresNode = EasyMock.createMock(Preferences.class);
-        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
-        Bundle installedBundle = EasyMock.createMock(Bundle.class);
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle);
-
-        FeaturesServiceImpl svc = new FeaturesServiceImpl();
-        svc.setPreferences(preferencesService);
-        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));
-
-        verify(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle);
-
-        reset(preferencesService, prefs, repositoriesNode, featuresNode, 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(bundleContext.getBundle(12345L)).andReturn(installedBundle);
-        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
-        installedBundle.start();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + FeatureImpl.DEFAULT_VERSION, "12345");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, 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>");
-        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();
-        
-        Preferences prefs = EasyMock.createMock(Preferences.class);
-        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
-        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
-        Preferences featuresNode = EasyMock.createMock(Preferences.class);
-        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
-        Bundle installedBundle = EasyMock.createMock(Bundle.class);
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle);
-
-        FeaturesServiceImpl svc = new FeaturesServiceImpl();
-        svc.setPreferences(preferencesService);
-        svc.setBundleContext(bundleContext);
-        svc.addRepository(uri);
-        
-        verify(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle);
-
-        reset(preferencesService, prefs, repositoriesNode, featuresNode, 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(bundleContext.getBundle(12345L)).andReturn(installedBundle);
-        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
-        installedBundle.start();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "12345");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        // 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(bundleContext.getBundle(123456L)).andReturn(installedBundle);
-        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
-        installedBundle.start();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "12345");
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "123456");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        // UnInstalls f1 and 0.1
-        expect(bundleContext.getBundle(12345)).andReturn(installedBundle);
-        installedBundle.uninstall();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "123456");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        // UnInstalls f1 and 0.2
-        expect(bundleContext.getBundle(123456)).andReturn(installedBundle);
-        installedBundle.uninstall();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, 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>");
-        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
-        Preferences prefs = EasyMock.createMock(Preferences.class);
-        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
-        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
-        Preferences featuresNode = EasyMock.createMock(Preferences.class);
-        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);        
-        Bundle installedBundle = EasyMock.createMock(Bundle.class);        
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();               
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        // SaveState for addRepository
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        // SaveState for removeRepository
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 0);              
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();        
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle);
-
-        FeaturesServiceImpl svc = new FeaturesServiceImpl();
-        svc.setPreferences(preferencesService);
-        svc.setBundleContext(bundleContext);        
-
-        // Adds Repository
-        svc.addRepository(uri);                                                     
-        
-        // Removes Repository
-        svc.removeRepository(uri);        
-    }
-
-    // Tests installing all features in a repo and uninstalling
-    // all features in a repo
-    public void testInstallUninstallAllFeatures() throws Exception {
-
-        String name = getJarUrl(Bundle.class);
-
-        File tmp = File.createTempFile("smx", ".feature");
-        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
-        pw.println("<features>");
-        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
-        Preferences prefs = EasyMock.createMock(Preferences.class);
-        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
-        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
-        Preferences featuresNode = EasyMock.createMock(Preferences.class);
-        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);        
-        Bundle installedBundle = EasyMock.createMock(Bundle.class);        
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        // Installs first feature name = f1, version = 0.1 
-        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
-        expect(bundleContext.installBundle(isA(String.class),
-                                           isA(InputStream.class))).andReturn(installedBundle);
-        expect(installedBundle.getBundleId()).andReturn(12345L);
-        expect(bundleContext.getBundle(12345L)).andReturn(installedBundle);
-        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
-        expect(installedBundle.getSymbolicName()).andReturn("bundle");
-
-        installedBundle.start();
-        
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "12345");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        // Installs second feature name = f1, version = 0.2
-        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
-        expect(bundleContext.installBundle(isA(String.class),
-                                           isA(InputStream.class))).andReturn(installedBundle);
-        expect(installedBundle.getBundleId()).andReturn(123456L);
-        expect(bundleContext.getBundle(123456L)).andReturn(installedBundle);
-        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
-        installedBundle.start();
-        
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "12345");
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "123456");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        // Installs third feature name = f2, version = 0.2
-        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
-        expect(bundleContext.installBundle(isA(String.class),
-                                           isA(InputStream.class))).andReturn(installedBundle);
-        expect(installedBundle.getBundleId()).andReturn(1234567L);
-        expect(bundleContext.getBundle(1234567L)).andReturn(installedBundle);
-        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
-        installedBundle.start();
-        
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "12345");
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "123456");
-        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "1234567");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 0);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "12345");
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "123456");
-        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "1234567");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        expect(installedBundle.getHeaders()).andReturn(new Hashtable()).anyTimes();
-
-        // uninstallAllFeatures 
-        
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "12345");
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "123456");
-        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "1234567");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        // uninstalls first feature name = f1, version = 0.1
-        expect(bundleContext.getBundle(12345)).andReturn(installedBundle);
-        installedBundle.uninstall();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "123456");
-        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "1234567");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        // uninstalls third feature name = f2, version = 0.2
-        expect(bundleContext.getBundle(1234567)).andReturn(installedBundle);
-        installedBundle.uninstall();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();        
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.2", "123456");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        // uninstalls second feature name = f1, version = 0.2
-        expect(bundleContext.getBundle(123456)).andReturn(installedBundle);
-        installedBundle.uninstall();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();        
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 0);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle);
-
-        FeaturesServiceImpl svc = new FeaturesServiceImpl();
-        svc.setPreferences(preferencesService);
-        svc.setBundleContext(bundleContext);        
-        svc.installAllFeatures(uri);
-        
-        // Uninstalls features with versions.
-        svc.uninstallAllFeatures(uri);    
-    }    
-
-
-    // Tests install of a Repository that includes a feature 
-    // with a feature dependency  
-    // The dependant feature is in the same repository 
-    // Tests uninstall of features
-    public void testInstallFeatureWithDependantFeatures() throws Exception {
-
-        String name = getJarUrl(Bundle.class);
-
-        File tmp = File.createTempFile("smx", ".feature");
-        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
-        pw.println("<features>");
-        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();
-
-        // loads the state
-        Preferences prefs = EasyMock.createMock(Preferences.class);
-        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
-        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
-        Preferences repositoriesAvailableNode = EasyMock.createMock(Preferences.class);
-        Preferences featuresNode = EasyMock.createMock(Preferences.class);
-        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);        
-        Bundle installedBundle = EasyMock.createMock(Bundle.class);        
-
-        // savestate from addRepository
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        // 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(bundleContext.getBundle(12345L)).andReturn(installedBundle);
-        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
-        installedBundle.start();
-        
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "12345");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        // 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(bundleContext.getBundle(1234L)).andReturn(installedBundle);
-        expect(installedBundle.getHeaders()).andReturn(new Hashtable()).anyTimes();
-        installedBundle.start();
-        
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "12345");
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "1234");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();                      
-
-        // uninstalls first feature name = f1, version = 0.1
-        expect(bundleContext.getBundle(1234)).andReturn(installedBundle);
-        installedBundle.uninstall();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.1", "12345");        
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-       // uninstalls first feature name = f2, version = 0.1
-        expect(bundleContext.getBundle(12345)).andReturn(installedBundle);
-        installedBundle.uninstall();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());        
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();        
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();                        
-        
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 0);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-        
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle);
-
-        FeaturesServiceImpl svc = new FeaturesServiceImpl();
-        svc.setPreferences(preferencesService);
-        svc.setBundleContext(bundleContext);        
-        svc.addRepository(uri);    
-
-        svc.installFeature("f1", "0.1");
-                
-        // Uninstall repository
-        svc.uninstallFeature("f1", "0.1");
-        svc.uninstallFeature("f2", "0.1");
-        
-    }
-
-    public void testInstallBatchFeatureWithContinueOnFailureNoClean() throws Exception {
-        String bundle1 = getJarUrl(Bundle.class);
-        String bundle2 = getJarUrl(PreferencesService.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>" + "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();
-
-        // loads the state
-        Preferences prefs = EasyMock.createMock(Preferences.class);
-        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
-        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
-        Preferences repositoriesAvailableNode = EasyMock.createMock(Preferences.class);
-        Preferences featuresNode = EasyMock.createMock(Preferences.class);
-        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
-        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
-        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
-
-        // savestate from addRepository
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        // 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(bundleContext.getBundles()).andReturn(new Bundle[0]);
-        expect(bundleContext.installBundle(eq(bundle2), isA(InputStream.class))).andReturn(installedBundle2);
-        expect(installedBundle2.getBundleId()).andReturn(54321L);
-        expect(installedBundle2.getHeaders()).andReturn(new Hashtable()).anyTimes();
-        installedBundle2.start();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.0.0", "54321");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2);
-
-        FeaturesServiceImpl svc = new FeaturesServiceImpl();
-        svc.setPreferences(preferencesService);
-        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(PreferencesService.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>" + "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();
-
-        // loads the state
-        Preferences prefs = EasyMock.createMock(Preferences.class);
-        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
-        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
-        Preferences repositoriesAvailableNode = EasyMock.createMock(Preferences.class);
-        Preferences featuresNode = EasyMock.createMock(Preferences.class);
-        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
-        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
-        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
-
-        // savestate from addRepository
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        // 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);
-        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.getHeaders()).andReturn(new Hashtable()).anyTimes();
-        installedBundle2.start();
-
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "0.0.0", "54321");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2);
-
-        FeaturesServiceImpl svc = new FeaturesServiceImpl();
-        svc.setPreferences(preferencesService);
-        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(PreferencesService.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>" + "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();
-
-        // loads the state
-        Preferences prefs = EasyMock.createMock(Preferences.class);
-        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
-        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
-        Preferences repositoriesAvailableNode = EasyMock.createMock(Preferences.class);
-        Preferences featuresNode = EasyMock.createMock(Preferences.class);
-        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
-        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
-        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
-
-        // savestate from addRepository
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        // 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(bundleContext.getBundles()).andReturn(new Bundle[0]);
-        expect(bundleContext.installBundle(eq(bundle2), isA(InputStream.class))).andReturn(installedBundle2);
-        expect(installedBundle2.getBundleId()).andReturn(54321L);
-        installedBundle2.start();
-
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2);
-
-        FeaturesServiceImpl svc = new FeaturesServiceImpl();
-        svc.setPreferences(preferencesService);
-        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(PreferencesService.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>" + "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();
-
-        // loads the state
-        Preferences prefs = EasyMock.createMock(Preferences.class);
-        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
-        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
-        Preferences repositoriesAvailableNode = EasyMock.createMock(Preferences.class);
-        Preferences featuresNode = EasyMock.createMock(Preferences.class);
-        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
-        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
-        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
-
-        // savestate from addRepository
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        // 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);
-        installedBundle1.uninstall();
-
-        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
-        expect(bundleContext.installBundle(eq(bundle2), isA(InputStream.class))).andReturn(installedBundle2);
-        expect(installedBundle2.getBundleId()).andReturn(54321L);
-        installedBundle2.uninstall();
-
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2);
-
-        FeaturesServiceImpl svc = new FeaturesServiceImpl();
-        svc.setPreferences(preferencesService);
-        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(PreferencesService.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
-        Preferences prefs = EasyMock.createMock(Preferences.class);
-        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
-        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
-        Preferences repositoriesAvailableNode = EasyMock.createMock(Preferences.class);
-        Preferences featuresNode = EasyMock.createMock(Preferences.class);
-        PackageAdmin packageAdmin = EasyMock.createMock(PackageAdmin.class);
-        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
-        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
-        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
-
-        // savestate from addRepository
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        expect(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        // Installs feature f1
-        expect(installedBundle1.getBundleId()).andReturn(12345L).anyTimes();
-        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.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(prefs.node("repositories")).andReturn(repositoriesNode);
-        repositoriesNode.clear();
-        repositoriesNode.putInt("count", 1);
-        repositoriesNode.put("item.0", uri.toString());
-        expect(prefs.node("features")).andReturn(featuresNode);
-        featuresNode.clear();
-        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + FeatureImpl.DEFAULT_VERSION, "12345,54321");
-        prefs.putBoolean("bootFeaturesInstalled", false);
-        prefs.flush();
-
-        replay(packageAdmin, preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2);
-
-        FeaturesServiceImpl svc = new FeaturesServiceImpl();
-        svc.setPackageAdmin(packageAdmin);
-        svc.setPreferences(preferencesService);
-        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);
-    }
-
-    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/features/core/src/test/java/org/apache/felix/karaf/features/RepositoryTest.java b/karaf/features/core/src/test/java/org/apache/felix/karaf/features/RepositoryTest.java
deleted file mode 100644
index 9718e13..0000000
--- a/karaf/features/core/src/test/java/org/apache/felix/karaf/features/RepositoryTest.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.felix.karaf.features;
-
-import java.net.URI;
-
-import junit.framework.TestCase;
-import org.apache.felix.karaf.features.internal.RepositoryImpl;
-import org.apache.felix.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(2, 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));
-        assertEquals("b2", features[0].getBundles().get(1));
-        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));
-    }
-    
-    public void testShowWrongUriInException() throws Exception {
-        String uri = "src/test/resources/org/apache/felix/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/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java b/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java
deleted file mode 100644
index 7775d3f..0000000
--- a/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.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.felix.karaf.features.internal;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import junit.framework.TestCase;
-import org.apache.felix.karaf.features.Feature;
-import org.apache.felix.utils.manifest.Clause;
-import org.osgi.service.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
-import org.osgi.service.prefs.PreferencesService;
-
-import static org.easymock.EasyMock.*;
-
-/**
- * Test cases for {@link FeaturesServiceImpl}
- */
-public class FeaturesServiceImplTest extends TestCase {
-    
-    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() throws BackingStoreException {
-        PreferencesService preferencesService = createNiceMock(PreferencesService.class);
-        Preferences prefs = createNiceMock(Preferences.class);
-        Preferences emptyPrefs = createNiceMock(Preferences.class);
-        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
-        replay(preferencesService);
-
-        expect(prefs.node("repositories")).andReturn(emptyPrefs);
-        expect(prefs.node("features")).andReturn(emptyPrefs);
-        replay(prefs);
-
-        FeaturesServiceImpl service = new FeaturesServiceImpl();
-        service.setPreferences(preferencesService);
-
-        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));
-        }
-    }
-
-    public void testGetOptionalImportsOnly() {
-        FeaturesServiceImpl service = new FeaturesServiceImpl();
-
-        List<Clause> result = service.getOptionalImports("org.apache.felix.karaf,org.apache.felix.karaf.optional;resolution:=optional");
-        assertEquals("One optional import expected", 1, result.size());
-        assertEquals("org.apache.felix.karaf.optional", result.get(0).getName());
-
-        result = service.getOptionalImports(null);
-        assertNotNull(result);
-        assertEquals("No optional imports expected", 0, result.size());
-    }
-}
diff --git a/karaf/features/core/src/test/resources/org/apache/felix/karaf/features/repo1.xml b/karaf/features/core/src/test/resources/org/apache/felix/karaf/features/repo1.xml
deleted file mode 100644
index 3284661..0000000
--- a/karaf/features/core/src/test/resources/org/apache/felix/karaf/features/repo1.xml
+++ /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.
--->
-<features>
-    <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>
-</features>
diff --git a/karaf/features/management/NOTICE b/karaf/features/management/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/features/management/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/features/management/pom.xml b/karaf/features/management/pom.xml
deleted file mode 100644
index 82da799..0000000
--- a/karaf/features/management/pom.xml
+++ /dev/null
@@ -1,126 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.features</groupId>
-        <artifactId>features</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.features</groupId>
-    <artifactId>org.apache.felix.karaf.features.management</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Features Management</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.features</groupId>
-            <artifactId>org.apache.felix.karaf.features.core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.bundlerepository</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.obr</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf</groupId>
-            <artifactId>org.apache.felix.karaf.management</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>
-        <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>
-                            !${project.artifactId}*,
-                            javax.management,
-                            javax.management.loading,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>org.apache.felix.karaf.features.management.internal</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/FeaturesServiceMBean.java b/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/FeaturesServiceMBean.java
deleted file mode 100644
index 2683846..0000000
--- a/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/FeaturesServiceMBean.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.felix.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 removeRepositroy(String url) throws Exception;
-
-    void installFeature(String name) throws Exception;
-
-    void installFeature(String name, String version) throws Exception;
-
-    void uninstallFeature(String name) throws Exception;
-
-    void uninstallFeature(String name, String version) throws Exception;
-
-    String FEATURE_NAME = "Name";
-
-    String FEATURE_VERSION = "Version";
-
-    String FEATURE_DEPENDENCIES = "Dependencies";
-
-    String FEATURE_BUNDLES = "Bundles";
-
-    String FEATURE_CONFIGURATIONS = "Configurations";
-
-    String FEATURE_INSTALLED = "Installed";
-
-    String FEATURE_CONFIG_PID = "Pid";
-    String FEATURE_CONFIG_ELEMENTS = "Elements";
-    String FEATURE_CONFIG_ELEMENT_KEY = "Key";
-    String FEATURE_CONFIG_ELEMENT_VALUE = "Value";
-
-    /**
-     * The type of the event which is emitted for features events
-     */
-    String FEATURE_EVENT_TYPE = "org.apache.felix.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_INSTALLED };
-
-    String[] FEATURE_IDENTIFIER = { FEATURE_NAME, FEATURE_VERSION };
-
-    String[] FEATURE_CONFIG = { FEATURE_CONFIG_PID, FEATURE_CONFIG_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.felix.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/features/management/src/main/java/org/apache/felix/karaf/features/management/codec/JmxFeature.java b/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/codec/JmxFeature.java
deleted file mode 100644
index f471282..0000000
--- a/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/codec/JmxFeature.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.features.management.codec;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-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.felix.karaf.features.Feature;
-import org.apache.felix.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;
-
-
-    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] = feature.getBundles().toArray(new String[feature.getBundles().size()]);
-            itemValues[4]  = getConfigTable(feature.getConfigurations());
-            itemValues[5] = 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);
-        for (Feature feature : features) {
-            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 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 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 = 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 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 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] = 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] = "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/features/management/src/main/java/org/apache/felix/karaf/features/management/codec/JmxFeatureEvent.java b/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/codec/JmxFeatureEvent.java
deleted file mode 100644
index 03f024a..0000000
--- a/karaf/features/management/src/main/java/org/apache/felix/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.felix.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.felix.karaf.features.FeatureEvent;
-import org.apache.felix.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/features/management/src/main/java/org/apache/felix/karaf/features/management/codec/JmxRepository.java b/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/codec/JmxRepository.java
deleted file mode 100644
index d2857f6..0000000
--- a/karaf/features/management/src/main/java/org/apache/felix/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.felix.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.felix.karaf.features.Repository;
-import org.apache.felix.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/features/management/src/main/java/org/apache/felix/karaf/features/management/codec/JmxRepositoryEvent.java b/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/codec/JmxRepositoryEvent.java
deleted file mode 100644
index 6e20032..0000000
--- a/karaf/features/management/src/main/java/org/apache/felix/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.felix.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.felix.karaf.features.RepositoryEvent;
-import org.apache.felix.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);
-        }
-    }
-}
\ No newline at end of file
diff --git a/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/internal/FeaturesServiceMBeanImpl.java b/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
deleted file mode 100644
index 98358f0..0000000
--- a/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
+++ /dev/null
@@ -1,188 +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.felix.karaf.features.management.internal;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Hashtable;
-import java.util.List;
-
-import javax.management.MBeanNotificationInfo;
-import javax.management.MBeanRegistration;
-import javax.management.MBeanServer;
-import javax.management.NotCompliantMBeanException;
-import javax.management.Notification;
-import javax.management.NotificationBroadcasterSupport;
-import javax.management.ObjectName;
-import javax.management.openmbean.TabularData;
-
-import org.apache.felix.karaf.features.Feature;
-import org.apache.felix.karaf.features.FeatureEvent;
-import org.apache.felix.karaf.features.FeaturesListener;
-import org.apache.felix.karaf.features.FeaturesService;
-import org.apache.felix.karaf.features.Repository;
-import org.apache.felix.karaf.features.RepositoryEvent;
-import org.apache.felix.karaf.features.management.FeaturesServiceMBean;
-import org.apache.felix.karaf.features.management.codec.JmxFeature;
-import org.apache.felix.karaf.features.management.codec.JmxFeatureEvent;
-import org.apache.felix.karaf.features.management.codec.JmxRepository;
-import org.apache.felix.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, new NotificationBroadcasterSupport() {
-            @Override
-            public MBeanNotificationInfo[] getNotificationInfo() {
-                return getBroadcastInfo();
-            }
-        });
-    }
-
-    public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception {
-        objectName = name;
-        this.server = server;
-        return name;
-    }
-
-    public void postRegister(Boolean registrationDone) {
-        registration = bundleContext.registerService(FeaturesListener.class.getName(),
-            getFeaturesListener(), new Hashtable());
-    }
-
-    public void preDeregister() throws Exception {
-        registration.unregister();
-    }
-
-    public void postDeregister() {
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public TabularData getFeatures() throws Exception {
-        try {
-            List<Feature> allFeatures = Arrays.asList(featuresService.listFeatures());
-            List<Feature> insFeatures = Arrays.asList(featuresService.listInstalledFeatures());
-            ArrayList<JmxFeature> features = new ArrayList<JmxFeature>();
-            for (Feature feature : allFeatures) {
-                features.add(new JmxFeature(feature, insFeatures.contains(feature)));
-            }
-            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 removeRepositroy(String uri) throws Exception {
-        featuresService.removeRepository(new URI(uri));
-    }
-
-    public void installFeature(String name) throws Exception {
-        featuresService.installFeature(name);
-    }
-
-    public void installFeature(String name, String version) throws Exception {
-        featuresService.installFeature(name, version);
-    }
-
-    public void uninstallFeature(String name) throws Exception {
-        featuresService.uninstallFeature(name);
-    }
-
-    public void uninstallFeature(String name, String version) throws Exception {
-        featuresService.uninstallFeature(name, version);
-    }
-
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-
-    public void setFeaturesService(FeaturesService featuresService) {
-        this.featuresService = featuresService;
-    }
-
-    public FeaturesListener getFeaturesListener() {
-        return new FeaturesListener() {
-            public void featureEvent(FeatureEvent event) {
-                if (!event.isReplay()) {
-                    Notification notification = new Notification(FEATURE_EVENT_TYPE, objectName, sequenceNumber++);
-                    notification.setUserData(new JmxFeatureEvent(event).asCompositeData());
-                    sendNotification(notification);
-                }
-            }
-            public void repositoryEvent(RepositoryEvent event) {
-                if (!event.isReplay()) {
-                    Notification notification = new Notification(REPOSITORY_EVENT_TYPE, objectName, sequenceNumber++);
-                    notification.setUserData(new JmxRepositoryEvent(event).asCompositeData());
-                    sendNotification(notification);
-                }
-            }
-        };
-    }
-
-
-    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};
-    }
-
-}
\ No newline at end of file
diff --git a/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/internal/StandardEmitterMBean.java b/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/internal/StandardEmitterMBean.java
deleted file mode 100644
index e999011..0000000
--- a/karaf/features/management/src/main/java/org/apache/felix/karaf/features/management/internal/StandardEmitterMBean.java
+++ /dev/null
@@ -1,59 +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.felix.karaf.features.management.internal;
-
-import javax.management.*;
-
-public class StandardEmitterMBean extends StandardMBean implements NotificationEmitter {
-
-    private NotificationBroadcasterSupport emitter;
-
-    public StandardEmitterMBean(Class mbeanInterface, NotificationBroadcasterSupport emitter) throws NotCompliantMBeanException {
-        super(mbeanInterface);
-        this.emitter = emitter;
-    }
-
-    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 emitter.getNotificationInfo();
-    }
-
-    @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/features/management/src/main/resources/OSGI-INF/blueprint/features-management.xml b/karaf/features/management/src/main/resources/OSGI-INF/blueprint/features-management.xml
deleted file mode 100644
index b8b221f..0000000
--- a/karaf/features/management/src/main/resources/OSGI-INF/blueprint/features-management.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"
-           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
-
-    <reference id="featuresService" interface="org.apache.felix.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.felix.karaf.features.management.internal.FeaturesServiceMBeanImpl">
-        <property name="bundleContext" ref="blueprintBundleContext" />
-        <property name="featuresService" ref="featuresService" />
-    </bean>
-
-    <bean id="mbeanRegister" class="org.apache.felix.karaf.management.MBeanRegistrer">
-        <property name="mbeans">
-            <map>
-                <entry value="org.apache.felix.karaf:type=features,name=${karaf.name}"
-                    key-ref="mbeanImpl" />
-            </map>
-        </property>
-    </bean>
-
-</blueprint>
diff --git a/karaf/features/pom.xml b/karaf/features/pom.xml
deleted file mode 100644
index 22046a8..0000000
--- a/karaf/features/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.features</groupId>
-    <artifactId>features</artifactId>
-    <packaging>pom</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Features</name>
-
-    <modules>
-        <module>core</module>
-        <module>command</module>
-        <module>management</module>
-    </modules>
-
-</project>
diff --git a/karaf/itests/NOTICE b/karaf/itests/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/itests/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/itests/pom.xml b/karaf/itests/pom.xml
deleted file mode 100644
index 5f38cd5..0000000
--- a/karaf/itests/pom.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf</groupId>
-    <artifactId>itests</artifactId>
-    <packaging>jar</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: ITests</name>
-
-    <description>
-        Integration tests
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <!-- This is required to be first so that pax-exam classloader is not messed up with a newer version of felix
-              which would lead to java.lang.NoSuchMethodError: org.apache.felix.framework.Logger.<init>(I)V -->
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.framework</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-        <!-- This is required to be first so that pax-exam classloader is not messed up with a newer version of felix
-              which would lead to java.lang.RuntimeException: Could not create [service.obr] -->
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.bundlerepository</artifactId>
-            <version>1.2.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.tooling</groupId>
-            <artifactId>org.apache.felix.karaf.tooling.testing</artifactId>
-            <scope>test</scope>
-        </dependency>
-   </dependencies>
-
-    <build>
-        <plugins>
-            <!-- generate dependencies versions -->
-            <plugin>
-                <groupId>org.apache.servicemix.tooling</groupId>
-                <artifactId>depends-maven-plugin</artifactId>
-                <version>1.1</version>
-                <executions>
-                    <execution>
-                        <id>generate-depends-file</id>
-                        <goals>
-                            <goal>generate-depends-file</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>ci-build-profile</id>
-            <activation>
-                <property>
-                   <name>maven.repo.local</name>
-                </property>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <configuration>
-                           <!-- when the local repo location has been specified, we need to pass on this information to PAX mvn url -->
-                           <argLine>-Dorg.ops4j.pax.url.mvn.localRepository=${maven.repo.local}</argLine>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/karaf/itests/src/test/java/org/apache/felix/karaf/shell/itests/CoreTest.java b/karaf/itests/src/test/java/org/apache/felix/karaf/shell/itests/CoreTest.java
deleted file mode 100644
index 22875f9..0000000
--- a/karaf/itests/src/test/java/org/apache/felix/karaf/shell/itests/CoreTest.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.felix.karaf.shell.itests;
-
-import org.apache.felix.karaf.testing.AbstractIntegrationTest;
-import org.apache.felix.karaf.testing.Helper;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.junit.Configuration;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.osgi.framework.Bundle;
-import org.osgi.service.command.CommandProcessor;
-import org.osgi.service.command.CommandSession;
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.ops4j.pax.exam.CoreOptions.equinox;
-import static org.ops4j.pax.exam.CoreOptions.felix;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-import static org.ops4j.pax.exam.CoreOptions.waitForFrameworkStartup;
-import static org.ops4j.pax.exam.OptionUtils.combine;
-
-import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.workingDirectory;
-
-@RunWith(JUnit4TestRunner.class)
-public class CoreTest extends AbstractIntegrationTest {
-
-    @Test
-    public void testHelp() throws Exception {
-        Thread.sleep(10000);
-
-        CommandProcessor cp = getOsgiService(CommandProcessor.class);
-        CommandSession cs = cp.createSession(System.in, System.out, System.err);
-        cs.execute("osgi:list --help");
-        cs.close();
-    }
-
-    @Test
-    public void testInstallCommand() throws Exception {
-        Thread.sleep(12000);
-
-        CommandProcessor cp = getOsgiService(CommandProcessor.class);
-        CommandSession cs = cp.createSession(System.in, System.out, System.err);
-
-        try {
-            cs.execute("log:display");
-            fail("command should not exist");
-        } catch (IllegalArgumentException e) {
-            assertTrue(e.getMessage().indexOf("Command not found") >= 0);
-        }
-
-        Bundle b = getInstalledBundle("org.apache.felix.karaf.shell.log");
-        b.start();
-
-        Thread.sleep(1000);
-
-        cs.execute("log:display");
-
-        b.stop();
-
-        Thread.sleep(1000);
-
-        try {
-            cs.execute("log:display");
-            fail("command should not exist");
-        } catch (IllegalArgumentException e) {
-            assertTrue(e.getMessage().indexOf("Command not found") >= 0);
-        }
-
-        cs.close();
-    }
-
-//    @Test
-//    public void testCommandGroup() throws Exception {
-//        Thread.sleep(5000);
-//
-//        Shell shell = getOsgiService(Shell.class);
-//        shell.execute("osgi");
-//        shell.execute("help");
-//        shell.execute("..");
-//    }
-//
-//    @Test
-//    public void testCommandGroupAfterInstall() throws Exception {
-//        Bundle b = getInstalledBundle("org.apache.felix.karaf.shell.log");
-//        b.start();
-//
-//        Thread.sleep(5000);
-//
-//        Shell shell = getOsgiService(Shell.class);
-//        shell.execute("log");
-//        shell.execute("help");
-//        shell.execute("..");
-//    }
-//
-    @Configuration
-    public static Option[] configuration() throws Exception {
-        Option[] options = combine(
-            // Default karaf environment
-            Helper.getDefaultOptions(
-                // this is how you set the default log level when using pax logging (logProfile)
-                systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("DEBUG")),
-
-            workingDirectory("target/paxrunner/core/"),
-
-            waitForFrameworkStartup(),
-
-            // Test on both equinox and felix
-            equinox(), felix()
-        );
-        // Stop the shell log bundle 
-        Helper.findMaven(options, "org.apache.felix.karaf.shell", "org.apache.felix.karaf.shell.log").noStart();
-        return options;
-    }
-
-}
diff --git a/karaf/itests/src/test/java/org/apache/felix/karaf/shell/itests/FeaturesTest.java b/karaf/itests/src/test/java/org/apache/felix/karaf/shell/itests/FeaturesTest.java
deleted file mode 100644
index bdede08..0000000
--- a/karaf/itests/src/test/java/org/apache/felix/karaf/shell/itests/FeaturesTest.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.karaf.shell.itests;
-
-import org.apache.felix.karaf.testing.AbstractIntegrationTest;
-import org.apache.felix.karaf.testing.Helper;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.junit.Configuration;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.osgi.service.blueprint.container.BlueprintContainer;
-import org.osgi.service.command.CommandProcessor;
-import org.osgi.service.command.CommandSession;
-
-import static org.junit.Assert.assertNotNull;
-import static org.ops4j.pax.exam.CoreOptions.equinox;
-import static org.ops4j.pax.exam.CoreOptions.felix;
-import static org.ops4j.pax.exam.CoreOptions.maven;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-import static org.ops4j.pax.exam.CoreOptions.waitForFrameworkStartup;
-import static org.ops4j.pax.exam.OptionUtils.combine;
-import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.scanFeatures;
-
-import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.workingDirectory;
-
-@RunWith(JUnit4TestRunner.class)
-public class FeaturesTest extends AbstractIntegrationTest {
-
-    @Test
-    public void testFeatures() throws Exception {
-        // Make sure the command services are available
-        assertNotNull(getOsgiService(BlueprintContainer.class, "osgi.blueprint.container.symbolicname=org.apache.felix.karaf.shell.obr", 20000));
-        assertNotNull(getOsgiService(BlueprintContainer.class, "osgi.blueprint.container.symbolicname=org.apache.felix.karaf.shell.wrapper", 20000));
-        // Run some commands to make sure they are installed properly
-        CommandProcessor cp = getOsgiService(CommandProcessor.class);
-        CommandSession cs = cp.createSession(System.in, System.out, System.err);
-        cs.execute("obr:listUrl");
-        cs.execute("wrapper:install --help");
-        cs.close();
-    }
-
-    @Configuration
-    public static Option[] configuration() throws Exception{
-        return combine(
-            // Default karaf environment
-            Helper.getDefaultOptions(
-                // this is how you set the default log level when using pax logging (logProfile)
-                systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("DEBUG")),
-
-            // add two features
-            scanFeatures(
-                    maven().groupId("org.apache.felix.karaf").artifactId("apache-felix-karaf").type("xml").classifier("features").versionAsInProject(),
-                    "obr", "wrapper"
-            ),
-
-            workingDirectory("target/paxrunner/features/"),
-
-            waitForFrameworkStartup(),
-            
-            // Test on both equinox and felix
-            equinox(), felix()
-        );
-    }
-
-}
diff --git a/karaf/itests/src/test/java/org/apache/felix/karaf/shell/itests/HeaderParser.java b/karaf/itests/src/test/java/org/apache/felix/karaf/shell/itests/HeaderParser.java
deleted file mode 100644
index a6b6387..0000000
--- a/karaf/itests/src/test/java/org/apache/felix/karaf/shell/itests/HeaderParser.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.itests;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Utility class to parse a standard OSGi header with paths.
- *
- * @author <a href="mailto:dev@geronimo.apache.org">Apache Geronimo Project</a>
- * @version $Rev: 786132 $, $Date: 2009-06-18 17:47:58 +0200 (Thu, 18 Jun 2009) $
- */
-public final class HeaderParser  {
-
-    // Private constructor for static final class
-    private HeaderParser() {
-    }
-
-    /**
-     * Parse a given OSGi header into a list of paths
-     *
-     * @param header the OSGi header to parse
-     * @return the list of paths extracted from this header
-     */
-    public static List<PathElement> parseHeader(String header) {
-        List<PathElement> elements = new ArrayList<PathElement>();
-        if (header == null || header.trim().length() == 0) {
-            return elements;
-        }
-        String[] clauses = parseDelimitedString(header, ",");
-        for (String clause : clauses) {
-            String[] tokens = clause.split(";");
-            if (tokens.length < 1) {
-                throw new IllegalArgumentException("Invalid header clause: " + clause);
-            }
-            PathElement elem = new PathElement(tokens[0].trim());
-            elements.add(elem);
-            for (int i = 1; i < tokens.length; i++) {
-                int pos = tokens[i].indexOf('=');
-                if (pos != -1) {
-                    if (pos > 0 && tokens[i].charAt(pos - 1) == ':') {
-                        String name = tokens[i].substring(0, pos - 1).trim();
-                        String value = tokens[i].substring(pos + 1).trim();
-                        if (value.startsWith("\"") && value.endsWith("\"")) {
-                            value = value.substring(1, value.length() - 1);
-                        }
-                        elem.addDirective(name, value);
-                    } else {
-                        String name = tokens[i].substring(0, pos).trim();
-                        String value = tokens[i].substring(pos + 1).trim();
-                        if (value.startsWith("\"") && value.endsWith("\"")) {
-                            value = value.substring(1, value.length() - 1);
-                        }
-                        elem.addAttribute(name, value);
-                    }
-                } else {
-                    elem = new PathElement(tokens[i].trim());
-                    elements.add(elem);
-                }
-            }
-        }
-        return elements;
-    }
-
-    /**
-     * Parses delimited string and returns an array containing the tokens. This
-     * parser obeys quotes, so the delimiter character will be ignored if it is
-     * inside of a quote. This method assumes that the quote character is not
-     * included in the set of delimiter characters.
-     * @param value the delimited string to parse.
-     * @param delim the characters delimiting the tokens.
-     * @return an array of string tokens or null if there were no tokens.
-    **/
-    public static String[] parseDelimitedString(String value, String delim)
-    {
-        if (value == null)
-        {
-           value = "";
-        }
-
-        List list = new ArrayList();
-
-        int CHAR = 1;
-        int DELIMITER = 2;
-        int STARTQUOTE = 4;
-        int ENDQUOTE = 8;
-
-        StringBuffer sb = new StringBuffer();
-
-        int expecting = (CHAR | DELIMITER | STARTQUOTE);
-
-        for (int i = 0; i < value.length(); i++)
-        {
-            char c = value.charAt(i);
-
-            boolean isDelimiter = (delim.indexOf(c) >= 0);
-            boolean isQuote = (c == '"');
-
-            if (isDelimiter && ((expecting & DELIMITER) > 0))
-            {
-                list.add(sb.toString().trim());
-                sb.delete(0, sb.length());
-                expecting = (CHAR | DELIMITER | STARTQUOTE);
-            }
-            else if (isQuote && ((expecting & STARTQUOTE) > 0))
-            {
-                sb.append(c);
-                expecting = CHAR | ENDQUOTE;
-            }
-            else if (isQuote && ((expecting & ENDQUOTE) > 0))
-            {
-                sb.append(c);
-                expecting = (CHAR | STARTQUOTE | DELIMITER);
-            }
-            else if ((expecting & CHAR) > 0)
-            {
-                sb.append(c);
-            }
-            else
-            {
-                throw new IllegalArgumentException("Invalid delimited string: " + value);
-            }
-        }
-
-        if (sb.length() > 0)
-        {
-            list.add(sb.toString().trim());
-        }
-
-        return (String[]) list.toArray(new String[list.size()]);
-    }
-
-    public static class PathElement {
-
-        private String path;
-        private Map<String, String> attributes;
-        private Map<String, String> directives;
-
-        public PathElement(String path) {
-            this.path = path;
-            this.attributes = new HashMap<String, String>();
-            this.directives = new HashMap<String, String>();
-        }
-
-        public String getName() {
-            return this.path;
-        }
-
-        public Map<String, String> getAttributes() {
-            return attributes;
-        }
-
-        public String getAttribute(String name) {
-            return attributes.get(name);
-        }
-
-        public void addAttribute(String name, String value) {
-            attributes.put(name, value);
-        }
-
-        public Map<String, String> getDirectives() {
-            return directives;
-        }
-
-        public String getDirective(String name) {
-            return directives.get(name);
-        }
-
-        public void addDirective(String name, String value) {
-            directives.put(name, value);
-        }
-
-        public String toString() {
-            StringBuilder sb = new StringBuilder(this.path);
-            for (Map.Entry<String,String> directive : this.directives.entrySet()) {
-                sb.append(";").append(directive.getKey()).append(":=").append(directive.getValue());
-            }
-            for (Map.Entry<String,String> attribute : this.attributes.entrySet()) {
-                sb.append(";").append(attribute.getKey()).append("=").append(attribute.getValue());
-            }
-            return sb.toString();
-        }
-
-    }
-}
diff --git a/karaf/itests/src/test/resources/log4j.properties b/karaf/itests/src/test/resources/log4j.properties
deleted file mode 100644
index 0ca7b6a..0000000
--- a/karaf/itests/src/test/resources/log4j.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.
-#
-################################################################################
-
-# Root logger
-log4j.rootLogger=INFO, stdout
-
-# CONSOLE appender not used by default
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
-
-# File appender
-log4j.appender.out=org.apache.log4j.FileAppender
-log4j.appender.out.layout=org.apache.log4j.PatternLayout
-log4j.appender.out.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
-log4j.appender.out.file=${karaf.base}/data/log/karaf.log
-log4j.appender.out.append=true
diff --git a/karaf/jaas/boot/NOTICE b/karaf/jaas/boot/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/jaas/boot/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/jaas/boot/pom.xml b/karaf/jaas/boot/pom.xml
deleted file mode 100644
index e4aced2..0000000
--- a/karaf/jaas/boot/pom.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.jaas</groupId>
-        <artifactId>jaas</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.jaas</groupId>
-    <artifactId>org.apache.felix.karaf.jaas.boot</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: JAAS Boot</name>
-
-    <description>
-        Provides the JAAS Boot classes
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <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>!${project.artifactId}*,*</Import-Package>
-                        <Private-Package>!*</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/jaas/boot/src/main/java/org/apache/felix/karaf/jaas/boot/ProxyLoginModule.java b/karaf/jaas/boot/src/main/java/org/apache/felix/karaf/jaas/boot/ProxyLoginModule.java
deleted file mode 100644
index b95641f..0000000
--- a/karaf/jaas/boot/src/main/java/org/apache/felix/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.felix.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.felix.karaf.jaas.module";
-    public static final String PROPERTY_BUNDLE = "org.apache.felix.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/jaas/config/NOTICE b/karaf/jaas/config/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/jaas/config/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/jaas/config/pom.xml b/karaf/jaas/config/pom.xml
deleted file mode 100644
index 6fbfef0..0000000
--- a/karaf/jaas/config/pom.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.jaas</groupId>
-        <artifactId>jaas</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.jaas</groupId>
-    <artifactId>org.apache.felix.karaf.jaas.config</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: JAAS Config</name>
-
-    <description>
-        Provides the JAAS Config
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix.karaf.jaas</groupId>
-            <artifactId>org.apache.felix.karaf.jaas.boot</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.osgi</groupId>
-            <artifactId>spring-osgi-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <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>!${project.artifactId}*,*</Import-Package>
-                        <Private-Package>${project.artifactId}.impl</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/JaasRealm.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/JaasRealm.java
deleted file mode 100644
index d1a40f5..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/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.felix.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/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/KeyIsLocked.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/KeyIsLocked.java
deleted file mode 100644
index bfaaba2..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/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.felix.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/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/KeystoreInstance.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/KeystoreInstance.java
deleted file mode 100644
index 4f0890b..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/KeystoreInstance.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.felix.karaf.jaas.config;
-
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.Certificate;
-
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.TrustManager;
-
-/**
- * Based on http://svn.apache.org/repos/asf/geronimo/trunk/modules/management/
- *              src/java/org/apache/geronimo/management/geronimo/KeystoreInstance.java
- *
- * @version $Rev: $ $Date: $
- */
-public interface KeystoreInstance {
-
-    String getName();
-
-    int getRank();
-
-    String[] listPrivateKeys();
-
-    String[] listTrustCertificates();
-
-    Certificate getCertificate(String alias);
-
-    String getCertificateAlias(Certificate cert);
-
-    Certificate[] getCertificateChain(String alias);
-
-    PrivateKey getPrivateKey(String alias);
-
-    boolean isKeystoreLocked();
-
-    boolean isKeyLocked(String keyAlias);
-
-    KeyManager[] getKeyManager(String algorithm, String keyAlias) throws NoSuchAlgorithmException,
-                                UnrecoverableKeyException, KeyStoreException, KeystoreIsLocked;
-
-    TrustManager[] getTrustManager(String algorithm) throws KeyStoreException, NoSuchAlgorithmException, KeystoreIsLocked;
-
-}
diff --git a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/KeystoreIsLocked.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/KeystoreIsLocked.java
deleted file mode 100644
index ae5efe6..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/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.felix.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/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/KeystoreManager.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/KeystoreManager.java
deleted file mode 100644
index afa2adf..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/KeystoreManager.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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.
-     *
-     * @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.
-     *
-     * @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.
-     *
-     * @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/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/Config.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/Config.java
deleted file mode 100644
index c0e4e5c..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/Config.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.jaas.config.impl;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.security.auth.login.AppConfigurationEntry;
-
-import org.apache.felix.karaf.jaas.boot.ProxyLoginModule;
-import org.apache.felix.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>();
-                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/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/Module.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/Module.java
deleted file mode 100644
index ae74205..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/Module.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.felix.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 className;
-    private String flags;
-    private Properties options;
-
-    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/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/NamespaceHandler.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/NamespaceHandler.java
deleted file mode 100644
index 4c5e8d8..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/NamespaceHandler.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.felix.karaf.jaas.config.impl;
-
-import java.net.URL;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.CharacterData;
-import org.w3c.dom.Comment;
-import org.w3c.dom.EntityReference;
-
-import org.osgi.service.blueprint.container.ComponentDefinitionException;
-import org.osgi.service.blueprint.reflect.ComponentMetadata;
-import org.osgi.service.blueprint.reflect.ValueMetadata;
-import org.osgi.service.blueprint.reflect.RefMetadata;
-import org.osgi.service.blueprint.reflect.Metadata;
-import org.apache.felix.karaf.jaas.config.JaasRealm;
-import org.apache.felix.karaf.jaas.config.KeystoreInstance;
-import org.apache.felix.karaf.jaas.boot.ProxyLoginModule;
-import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
-import org.apache.aries.blueprint.mutable.MutableValueMetadata;
-import org.apache.aries.blueprint.mutable.MutableRefMetadata;
-import org.apache.aries.blueprint.mutable.MutableCollectionMetadata;
-import org.apache.aries.blueprint.mutable.MutableServiceMetadata;
-import org.apache.aries.blueprint.ParserContext;
-
-public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHandler {
-
-    public URL getSchemaLocation(String namespace) {
-        return getClass().getResource("/org/apache/felix/karaf/jaas/config/karaf-jaas.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("http://felix.apache.org/karaf/xmlns/jaas/v1.0.0", "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("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/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/OsgiConfiguration.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/OsgiConfiguration.java
deleted file mode 100644
index 405161a..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/OsgiConfiguration.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.felix.karaf.jaas.config.impl;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import javax.security.auth.login.AppConfigurationEntry;
-import javax.security.auth.login.Configuration;
-
-import org.apache.felix.karaf.jaas.config.JaasRealm;
-
-public class OsgiConfiguration extends Configuration {
-
-    private final List<JaasRealm> realms = new CopyOnWriteArrayList<JaasRealm>();
-
-    public void init() {
-        Configuration.setConfiguration(this);
-    }
-
-    public void close() {
-        realms.clear();
-        Configuration.setConfiguration(null);
-    }
-
-    public void register(JaasRealm realm, Map<String,?> properties) {
-        realms.add(realm);
-    }
-
-    public void unregister(JaasRealm realm, Map<String,?> properties) {
-        realms.remove(realm);
-    }
-
-    public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
-        JaasRealm realm = null;
-        for (JaasRealm r : realms) {
-            if (r.getName().equals(name)) {
-                if (realm == null || r.getRank() > realm.getRank()) {
-                    realm = r;
-                }
-            }
-        }
-        if (realm != null) {
-            return realm.getEntries();
-        }
-        return null;
-    }
-
-    public void refresh() {
-        // Nothing to do, as we auto-update the configuration
-    }
-}
diff --git a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/OsgiKeystoreManager.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/OsgiKeystoreManager.java
deleted file mode 100644
index bb75dce..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/OsgiKeystoreManager.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.felix.karaf.jaas.config.impl;
-
-import java.security.GeneralSecurityException;
-import java.security.SecureRandom;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLServerSocketFactory;
-import javax.net.ssl.SSLSocketFactory;
-
-import org.apache.felix.karaf.jaas.config.KeystoreInstance;
-import org.apache.felix.karaf.jaas.config.KeystoreIsLocked;
-import org.apache.felix.karaf.jaas.config.KeystoreManager;
-
-/**
- * Implementation of KeystoreManager
- */
-public class OsgiKeystoreManager implements KeystoreManager {
-
-    private List<KeystoreInstance> keystores = new CopyOnWriteArrayList<KeystoreInstance>();
-
-    public void register(KeystoreInstance keystore, Map<String,?> properties) {
-        keystores.add(keystore);
-    }
-
-    public void unregister(KeystoreInstance keystore, Map<String,?> properties) {
-        keystores.remove(keystore);
-    }
-
-    public KeystoreInstance getKeystore(String name) {
-        KeystoreInstance keystore = null;
-        for (KeystoreInstance ks : keystores) {
-            if (ks.getName().equals(name)) {
-                if (keystore == null || keystore.getRank() < ks.getRank()) {
-                    keystore = ks;
-                }
-            }
-        }
-        return keystore;
-    }
-
-    public SSLContext createSSLContext(String provider, String protocol, String algorithm, String keyStore, String keyAlias, String trustStore) throws GeneralSecurityException {
-        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 {
-        SSLContext context = createSSLContext(provider, protocol, algorithm, keyStore, keyAlias, trustStore);
-        return context.getServerSocketFactory();
-    }
-
-    public SSLSocketFactory createSSLFactory(String provider, String protocol, String algorithm, String keyStore, String keyAlias, String trustStore) throws GeneralSecurityException {
-        SSLContext context = createSSLContext(provider, protocol, algorithm, keyStore, keyAlias, trustStore);
-        return context.getSocketFactory();
-    }
-}
diff --git a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/ProxyLoginModuleInitializer.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/ProxyLoginModuleInitializer.java
deleted file mode 100644
index d69cc90..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/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.felix.karaf.jaas.config.impl;
-
-import org.apache.felix.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/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/ResourceKeystoreInstance.java b/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/ResourceKeystoreInstance.java
deleted file mode 100644
index 4d7f792..0000000
--- a/karaf/jaas/config/src/main/java/org/apache/felix/karaf/jaas/config/impl/ResourceKeystoreInstance.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.felix.karaf.jaas.config.KeystoreInstance;
-import org.apache.felix.karaf.jaas.config.KeystoreIsLocked;
-
-/**
- *
- */
-public class ResourceKeystoreInstance implements KeystoreInstance {
-
-    private static final Log LOG = LogFactory.getLog(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) {
-            LOG.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) {
-            LOG.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) {
-            LOG.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) {
-            LOG.error("Unable to read private key from keystore", e);
-        } catch (NoSuchAlgorithmException e) {
-            LOG.error("Unable to read private key from keystore", e);
-        } catch (UnrecoverableKeyException e) {
-            LOG.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) {
-            LOG.error("Unable to open keystore with provided password", e);
-        } catch (IOException e) {
-            LOG.error("Unable to open keystore with provided password", e);
-        } catch (NoSuchAlgorithmException e) {
-            LOG.error("Unable to open keystore with provided password", e);
-        } catch (CertificateException e) {
-            LOG.error("Unable to open keystore with provided password", e);
-        }
-        return false;
-    }
-
-}
diff --git a/karaf/jaas/config/src/main/resources/OSGI-INF/blueprint/karaf-jaas.xml b/karaf/jaas/config/src/main/resources/OSGI-INF/blueprint/karaf-jaas.xml
deleted file mode 100644
index b751552..0000000
--- a/karaf/jaas/config/src/main/resources/OSGI-INF/blueprint/karaf-jaas.xml
+++ /dev/null
@@ -1,54 +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.felix.karaf.jaas.config.impl.OsgiConfiguration"
-          init-method="init"
-          destroy-method="close"/>
-
-    <reference-list id="realms"
-                    interface="org.apache.felix.karaf.jaas.config.JaasRealm"
-                    availability="optional">
-        <reference-listener ref="config" bind-method="register" unbind-method="unregister" />
-    </reference-list>
-
-    <bean id="proxyLoginModuleInitializer" class="org.apache.felix.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.felix.karaf.jaas.config.impl.OsgiKeystoreManager" />
-    <service ref="keystoreManager" interface="org.apache.felix.karaf.jaas.config.KeystoreManager" />
-
-    <reference-list id="keystores"
-                    interface="org.apache.felix.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" value="http://felix.apache.org/karaf/xmlns/jaas/v1.0.0"/>
-        </service-properties>
-        <bean class="org.apache.felix.karaf.jaas.config.impl.NamespaceHandler"/>
-    </service>
-
-</blueprint>
diff --git a/karaf/jaas/config/src/main/resources/org/apache/felix/karaf/jaas/config/karaf-jaas.xsd b/karaf/jaas/config/src/main/resources/org/apache/felix/karaf/jaas/config/karaf-jaas.xsd
deleted file mode 100644
index 0a9f8d4..0000000
--- a/karaf/jaas/config/src/main/resources/org/apache/felix/karaf/jaas/config/karaf-jaas.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://felix.apache.org/karaf/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://felix.apache.org/karaf/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/jaas/modules/NOTICE b/karaf/jaas/modules/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/jaas/modules/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/jaas/modules/pom.xml b/karaf/jaas/modules/pom.xml
deleted file mode 100644
index 4c73ea0..0000000
--- a/karaf/jaas/modules/pom.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.jaas</groupId>
-        <artifactId>jaas</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.jaas</groupId>
-    <artifactId>org.apache.felix.karaf.jaas.modules</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: JAAS Modules</name>
-
-    <description>
-        Provides the JAAS Config
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix.karaf.jaas</groupId>
-            <artifactId>org.apache.felix.karaf.jaas.config</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.osgi</groupId>
-            <artifactId>spring-osgi-core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint</artifactId>
-        </dependency>        
-    </dependencies>
-
-    <build>
-        <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>
-                            !${project.artifactId}*,
-                            org.apache.felix.karaf.jaas.config,
-                            org.apache.aries.blueprint.ext,
-                            *
-                        </Import-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/RolePrincipal.java b/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/RolePrincipal.java
deleted file mode 100644
index 1e70880..0000000
--- a/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/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.felix.karaf.jaas.modules;
-
-import java.security.Principal;
-
-public class RolePrincipal implements Principal {
-
-    private final String name;
-
-    public RolePrincipal(String name) {
-        assert name != null;
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof RolePrincipal)) return false;
-
-        RolePrincipal that = (RolePrincipal) o;
-
-        if (name != null ? !name.equals(that.name) : that.name != null) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return name != null ? name.hashCode() : 0;
-    }
-
-    @Override
-    public String toString() {
-        return "RolePrincipal[" + name + "]";
-    }
-}
diff --git a/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/UserPrincipal.java b/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/UserPrincipal.java
deleted file mode 100644
index c791db9..0000000
--- a/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/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.felix.karaf.jaas.modules;
-
-import java.security.Principal;
-
-public class UserPrincipal implements Principal {
-
-    private final String name;
-
-    public UserPrincipal(String name) {
-        assert name != null;
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof UserPrincipal)) return false;
-
-        UserPrincipal that = (UserPrincipal) o;
-
-        if (name != null ? !name.equals(that.name) : that.name != null) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return name != null ? name.hashCode() : 0;
-    }
-
-    @Override
-    public String toString() {
-        return "UserPrincipal[" + name + "]";
-    }
-}
diff --git a/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/osgi/ConfigAdminHolder.java b/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/osgi/ConfigAdminHolder.java
deleted file mode 100644
index cef50a7..0000000
--- a/karaf/jaas/modules/src/main/java/org/apache/felix/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.felix.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/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/osgi/OsgiConfigLoginModule.java b/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/osgi/OsgiConfigLoginModule.java
deleted file mode 100644
index 5e29485..0000000
--- a/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/osgi/OsgiConfigLoginModule.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.felix.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 java.util.Set;
-
-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 javax.security.auth.spi.LoginModule;
-
-import org.apache.felix.karaf.jaas.modules.RolePrincipal;
-import org.apache.felix.karaf.jaas.modules.UserPrincipal;
-import org.osgi.service.cm.Configuration;
-
-public class OsgiConfigLoginModule implements LoginModule {
-
-    public static final String PID = "pid";
-    public static final String USER_PREFIX = "user.";
-
-    private Subject subject;
-    private CallbackHandler callbackHandler;
-    private Map<String, ?> options;
-
-    private Set<Principal> principals;
-
-    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
-        this.subject = subject;
-        this.callbackHandler = callbackHandler;
-        this.options = 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();
-            char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword();
-            if (tmpPassword == null) {
-                tmpPassword = new char[0];
-            }
-
-            String userInfos = (String) properties.get(USER_PREFIX + user);
-            if (userInfos == null) {
-                throw new FailedLoginException("User does not exist");
-            }
-            String[] infos = userInfos.split(",");
-            if (!new String(tmpPassword).equals(infos[0])) {
-                throw new FailedLoginException("Password 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 commit() throws LoginException {
-        subject.getPrincipals().addAll(principals);
-        return true;
-    }
-
-    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/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/properties/PropertiesConverter.java b/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/properties/PropertiesConverter.java
deleted file mode 100644
index b8dc6ee..0000000
--- a/karaf/jaas/modules/src/main/java/org/apache/felix/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.felix.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/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/properties/PropertiesLoginModule.java b/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/properties/PropertiesLoginModule.java
deleted file mode 100644
index 8219b4e..0000000
--- a/karaf/jaas/modules/src/main/java/org/apache/felix/karaf/jaas/modules/properties/PropertiesLoginModule.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.felix.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 java.util.Properties;
-import java.util.Set;
-
-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 javax.security.auth.spi.LoginModule;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.felix.karaf.jaas.modules.RolePrincipal;
-import org.apache.felix.karaf.jaas.modules.UserPrincipal;
-
-/**
- * JAAS Login module for user / password, based on two properties files.
- *
- */
-public class PropertiesLoginModule implements LoginModule {
-
-    private static final String USER_FILE = "users";
-    private static final Log LOG = LogFactory.getLog(PropertiesLoginModule.class);
-
-    private Subject subject;
-    private CallbackHandler callbackHandler;
-    private boolean debug;
-    private String usersFile;
-    private String user;
-    private Set principals = new HashSet();
-
-    public void initialize(Subject sub, CallbackHandler handler, Map sharedState, Map options) {
-        this.subject = sub;
-        this.callbackHandler = handler;
-
-        debug = "true".equalsIgnoreCase((String) options.get("debug"));
-        usersFile = (String) options.get(USER_FILE) + "";
-
-        if (debug) {
-            LOG.debug("Initialized debug=" + debug + " usersFile=" + usersFile);
-        }
-    }
-
-    public boolean login() throws LoginException {
-        Properties users = new Properties();
-        File f = new File(usersFile);
-        try {
-            users.load(new java.io.FileInputStream(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 = ((NameCallback) callbacks[0]).getName();
-        char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword();
-        if (tmpPassword == null) {
-            tmpPassword = new char[0];
-        }
-
-        String userInfos = null;
-
-        try {
-            userInfos = (String) users.get(user);
-        } catch (NullPointerException e) {
-            //error handled in the next statement
-        }
-        if (userInfos == null) {
-            throw new FailedLoginException("User " + user + " does not exist");
-        }
-        String[] infos = userInfos.split(",");
-        if (!new String(tmpPassword).equals(infos[0])) {
-            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 commit() throws LoginException {
-        subject.getPrincipals().addAll(principals);
-        clear();
-        if (debug) {
-            LOG.debug("commit");
-        }
-        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;
-    }
-
-    private void clear() {
-        user = null;
-    }
-}
diff --git a/karaf/jaas/modules/src/main/resources/OSGI-INF/blueprint/karaf-jaas-module.xml b/karaf/jaas/modules/src/main/resources/OSGI-INF/blueprint/karaf-jaas-module.xml
deleted file mode 100644
index 4abda4e..0000000
--- a/karaf/jaas/modules/src/main/resources/OSGI-INF/blueprint/karaf-jaas-module.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:jaas="http://felix.apache.org/karaf/xmlns/jaas/v1.0.0"
-           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
-
-    <type-converters>
-        <bean class="org.apache.felix.karaf.jaas.modules.properties.PropertiesConverter" />
-    </type-converters>
-
-    <!-- Bean to allow the $[karaf.base] property to be correctly resolved -->
-    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]"/>
-
-    <jaas:config name="karaf">
-        <jaas:module className="org.apache.felix.karaf.jaas.modules.properties.PropertiesLoginModule" flags="required">
-            users = $[karaf.base]/etc/users.properties
-        </jaas:module>
-    </jaas:config>
-
-</blueprint>
diff --git a/karaf/jaas/modules/src/test/java/org/apache/felix/karaf/jaas/modules/properties/PropertiesConverterTest.java b/karaf/jaas/modules/src/test/java/org/apache/felix/karaf/jaas/modules/properties/PropertiesConverterTest.java
deleted file mode 100644
index d3cbed4..0000000
--- a/karaf/jaas/modules/src/test/java/org/apache/felix/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.felix.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.felix.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/jaas/pom.xml b/karaf/jaas/pom.xml
deleted file mode 100644
index 9de2c7b..0000000
--- a/karaf/jaas/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.jaas</groupId>
-    <artifactId>jaas</artifactId>
-    <packaging>pom</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: JAAS</name>
-
-    <modules>
-        <module>boot</module>
-        <module>config</module>
-        <module>modules</module>
-    </modules>
-
-</project>
diff --git a/karaf/main/NOTICE b/karaf/main/NOTICE
deleted file mode 100644
index 7684a2a..0000000
--- a/karaf/main/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf :: Main
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/main/pom.xml b/karaf/main/pom.xml
deleted file mode 100644
index 0bbe38a..0000000
--- a/karaf/main/pom.xml
+++ /dev/null
@@ -1,210 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf</groupId>
-    <artifactId>org.apache.felix.karaf.main</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Main</name>
-
-    <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>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <_donotcopy>(CVS|.svn|config.properties)</_donotcopy>
-                        <Main-Class>org.apache.felix.karaf.main.Main</Main-Class>
-                        <Bundle-Name>Apache Felix Karaf</Bundle-Name>
-                        <Bundle-Description>OSGi R4 framework.</Bundle-Description>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Export-Package>org.apache.felix.karaf.main.spi.*;version=${project.version}</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>
-                        -->
-                    </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>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </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.apache.felix</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/main/src/main/java/org/apache/felix/karaf/main/Bootstrap.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/Bootstrap.java
deleted file mode 100644
index c09b3f9..0000000
--- a/karaf/main/src/main/java/org/apache/felix/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.felix.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/main/src/main/java/org/apache/felix/karaf/main/BootstrapLogManager.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/BootstrapLogManager.java
deleted file mode 100644
index c31af9c..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/BootstrapLogManager.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.felix.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 Handler getDefaultHandler () {
-        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.base}/data/log/karaf.log");
-            } finally {
-                if (fis != null) { 
-                    try {
-                        fis.close(); 
-                    } catch (IOException ioe) {
-                        ioe.printStackTrace();
-                    }
-                }
-            }
-            filename = Main.substVars(props.getProperty("log4j.appender.out.file"),"log4j.appender.out.file", null, null);
-            log = new File(filename);
-        }
-
-
-        try {
-            handler = new BootstrapLogManager.SimpleFileHandler(log);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-        return handler;
-    }
-
-    public static void setProperties(Properties configProps) {
-        BootstrapLogManager.configProps = configProps;
-    }
-
-
-    /**
-     * Implementation of java.util.logging.Handler that does simple appending
-     * to a named file.  Should be able to use this for bootstrap logging
-     * via java.util.logging prior to startup of pax logging.
-     */
-    public static class SimpleFileHandler extends StreamHandler {
-
-        public SimpleFileHandler (File file) throws IOException {
-            open(file, true);
-        }
-
-        private void open (File logfile, boolean append) throws IOException {
-            if (!logfile.getParentFile().exists()) {
-                try {
-                    logfile.getParentFile().mkdirs();
-                } catch (SecurityException se) {
-                    throw new IOException(se.getMessage());
-                }
-            }
-            FileOutputStream fout = new FileOutputStream(logfile, append);
-            BufferedOutputStream out = new BufferedOutputStream(fout);
-            setOutputStream(out);
-        }
-
-        public synchronized void publish (LogRecord record) {
-            if (!isLoggable(record)) {
-                return;
-            }
-            super.publish(record);
-            flush();
-        }
-    }
-
-
-}
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/DefaultJDBCLock.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/DefaultJDBCLock.java
deleted file mode 100644
index a331e1a..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/DefaultJDBCLock.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.karaf.main;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-/**
- * Represents an exclusive lock on a database,
- * used to avoid multiple Karaf instances attempting
- * to become master.
- * 
- * @version $Revision: $
- */
-public class DefaultJDBCLock implements Lock {
-
-    final Logger LOG = Logger.getLogger(this.getClass().getName());
-    
-    private static final String PROPERTY_LOCK_URL               = "karaf.lock.jdbc.url";
-    private static final String PROPERTY_LOCK_JDBC_DRIVER       = "karaf.lock.jdbc.driver";
-    private static final String PROPERTY_LOCK_JDBC_USER         = "karaf.lock.jdbc.user";
-    private static final String PROPERTY_LOCK_JDBC_PASSWORD     = "karaf.lock.jdbc.password";
-    private static final String PROPERTY_LOCK_JDBC_TABLE        = "karaf.lock.jdbc.table";
-    private static final String PROPERTY_LOCK_JDBC_CLUSTERNAME  = "karaf.lock.jdbc.clustername";
-    private static final String PROPERTY_LOCK_JDBC_TIMEOUT      = "karaf.lock.jdbc.timeout";
-    
-    private static final String DEFAULT_PASSWORD = "";
-    private static final String DEFAULT_USER = "";
-    private static final String DEFAULT_TABLE = "KARAF_LOCK";
-    private static final String DEFAULT_CLUSTERNAME = "karaf";
-    private static final String DEFAULT_TIMEOUT = "10"; // in seconds
-
-    final Statements statements;
-    Connection lockConnection;
-    String url;
-    String driver;
-    String user; 
-    String password;
-    String table;
-    String clusterName;
-    int timeout;
-
-    public DefaultJDBCLock(Properties props) {
-        LOG.addHandler(BootstrapLogManager.getDefaultHandler());
-        
-        this.url = props.getProperty(PROPERTY_LOCK_URL);
-        this.driver = props.getProperty(PROPERTY_LOCK_JDBC_DRIVER);
-        this.user = props.getProperty(PROPERTY_LOCK_JDBC_USER, DEFAULT_USER);
-        this.password = props.getProperty(PROPERTY_LOCK_JDBC_PASSWORD, DEFAULT_PASSWORD);
-        this.table = props.getProperty(PROPERTY_LOCK_JDBC_TABLE, DEFAULT_TABLE);
-        this.clusterName = props.getProperty(PROPERTY_LOCK_JDBC_CLUSTERNAME, DEFAULT_CLUSTERNAME);
-        this.timeout = Integer.parseInt(props.getProperty(PROPERTY_LOCK_JDBC_TIMEOUT, DEFAULT_TIMEOUT));
-        
-        this.statements = createStatements();
-        
-        init();
-    }
-    
-    Statements createStatements() {
-        Statements statements = new Statements();
-        statements.setTableName(table);
-        statements.setNodeName(clusterName);
-        return statements;
-    }
-    
-    void init() {
-        try {
-            createDatabase();
-            createSchema();
-        } catch (Exception e) {
-            LOG.severe("Error occured while attempting to obtain connection: " + e);
-        }
-    }
-    
-    void createDatabase() {
-        // do nothing in the default implementation
-    }
-
-    void createSchema() {
-        if (schemaExists()) {
-            return;
-        }
-        
-        String[] createStatments = this.statements.getLockCreateSchemaStatements(getCurrentTimeMillis());
-        Statement statement = null;
-        
-        try {
-            statement = getConnection().createStatement();
-            
-            for (String stmt : createStatments) {
-                statement.execute(stmt);
-            }
-            
-            getConnection().commit();
-        } catch (Exception e) {
-            LOG.severe("Could not create schema: " + e );
-        } finally {
-            closeSafely(statement);
-        }
-    }
-
-    boolean schemaExists() {
-        ResultSet rs = null;
-        boolean schemaExists = false;
-        
-        try {
-            rs = getConnection().getMetaData().getTables(null, null, statements.getFullLockTableName(), new String[] {"TABLE"});
-            schemaExists = rs.next();
-        } catch (Exception ignore) {
-            LOG.severe("Error testing for db table: " + ignore);
-        } finally {
-            closeSafely(rs);
-        }
-        
-        return schemaExists;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.apache.felix.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.felix.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.felix.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();
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/DerbyJDBCLock.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/DerbyJDBCLock.java
deleted file mode 100644
index 9d8f662..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/DerbyJDBCLock.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.felix.karaf.main;
-
-import java.sql.Connection;
-import java.util.Properties;
-
-/**
- * Represents an exclusive lock on a database,
- * used to avoid multiple Karaf instances attempting
- * to become master.
- * 
- * @version $Revision: $
- */
-public class DerbyJDBCLock extends DefaultJDBCLock {
-
-    public DerbyJDBCLock(Properties props) {
-        super(props);
-    }
-
-    @Override
-    Connection createConnection(String driver, String url, String username, String password) throws Exception {
-        url = (url.toLowerCase().contains("create=true")) ? url : url + ";create=true";
-        
-        return super.createConnection(driver, url, username, password);
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/Lock.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/Lock.java
deleted file mode 100644
index 7750fe7..0000000
--- a/karaf/main/src/main/java/org/apache/felix/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.felix.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;
-}
\ No newline at end of file
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/Main.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/Main.java
deleted file mode 100644
index f6df843..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/Main.java
+++ /dev/null
@@ -1,1231 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.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.*;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.lang.reflect.Method;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.felix.karaf.main.Utils;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.launch.Framework;
-import org.osgi.framework.launch.FrameworkFactory;
-import org.osgi.service.startlevel.StartLevel;
-
-/**
- * <p>
- * This class is the default way to instantiate and execute the framework. It is not
- * intended to be the only way to instantiate and execute the framework; rather, it is
- * one example of how to do so. When embedding the framework in a host application,
- * this class can serve as a simple guide of how to do so. It may even be
- * worthwhile to reuse some of its property handling capabilities. This class
- * is completely static and is only intended to start a single instance of
- * the framework.
- * </p>
- */
-public class Main {
-    /**
-     * The default name used for the system properties file.
-     */
-    public static final String SYSTEM_PROPERTIES_FILE_NAME = "system.properties";
-    /**
-     * The default name used for the configuration properties file.
-     */
-    public static final String CONFIG_PROPERTIES_FILE_NAME = "config.properties";
-    /**
-     * The default name used for the startup properties file.
-     */
-    public static final String STARTUP_PROPERTIES_FILE_NAME = "startup.properties";
-    /**
-     * The property name prefix for the launcher's auto-install property.
-     */
-    public static final String PROPERTY_AUTO_INSTALL = "karaf.auto.install";
-    /**
-     * The property for auto-discovering the bundles
-     */
-    public static final String PROPERTY_AUTO_START = "karaf.auto.start";
-    /**
-     * The system property for specifying the Karaf home directory.  The home directory
-     * hold the binary install of Karaf.
-     */
-    public static final String PROP_KARAF_HOME = "karaf.home";
-    /**
-     * The environment variable for specifying the Karaf home directory.  The home directory
-     * hold the binary install of Karaf.
-     */
-    public static final String ENV_KARAF_HOME = "KARAF_HOME";
-    /**
-     * The system property for specifying the Karaf base directory.  The base directory
-     * holds the configuration and data for a Karaf instance.
-     */
-    public static final String PROP_KARAF_BASE = "karaf.base";
-    /**
-     * The environment variable for specifying the Karaf base directory.  The base directory
-     * holds the configuration and data for a Karaf instance.
-     */
-    public static final String ENV_KARAF_BASE = "KARAF_BASE";
-
-    /**
-     * 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_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();
-
-    Logger LOG = Logger.getLogger(this.getClass().getName());
-
-    private File karafHome;
-    private File karafBase;
-    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 boolean exiting = false;
-    private boolean cmProcessed;
-
-    public Main(String[] args) {
-        this.args = args;
-    }
-
-    public void launch() throws Exception {
-        karafHome = Utils.getKarafHome();
-        karafBase = Utils.getKarafBase(karafHome);
-
-        //System.out.println("Karaf Home: "+main.karafHome.getPath());
-        //System.out.println("Karaf Base: "+main.karafBase.getPath());
-
-        System.setProperty(PROP_KARAF_HOME, karafHome.getPath());
-        System.setProperty(PROP_KARAF_BASE, karafBase.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);
-
-        updateClassLoader(configProps);
-
-        processSecurityProperties(configProps);
-
-        if (configProps.getProperty(Constants.FRAMEWORK_STORAGE) == null) {
-            File storage = new File(karafBase.getPath(), "data/cache");
-            try {
-                storage.mkdirs();
-            } catch (SecurityException se) {
-                throw new Exception(se.getMessage()); 
-            }
-            configProps.setProperty(Constants.FRAMEWORK_STORAGE, storage.getAbsolutePath());
-        }
-        
-        defaultStartLevel = Integer.parseInt(configProps.getProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL));
-        lockStartLevel = Integer.parseInt(configProps.getProperty(PROPERTY_LOCK_LEVEL, Integer.toString(lockStartLevel)));
-        lockDelay = Integer.parseInt(configProps.getProperty(PROPERTY_LOCK_DELAY, Integer.toString(lockDelay)));
-        configProps.setProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL, Integer.toString(lockStartLevel));
-        // Start up the OSGI framework
-
-        InputStream is = getClass().getResourceAsStream("/META-INF/services/" + FrameworkFactory.class.getName());
-        BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
-        String factoryClass = br.readLine();
-        br.close();
-        FrameworkFactory factory = (FrameworkFactory) getClass().getClassLoader().loadClass(factoryClass).newInstance();
-        framework = factory.newFramework(new StringMap(configProps, false));
-        framework.start();
-        processAutoProperties(framework.getBundleContext());
-        // Start lock monitor
-        new Thread() {
-            public void run() {
-                lock(configProps);
-            }
-        }.start();
-    }
-
-    public void destroy(boolean await) throws Exception {
-        if (framework == null) {
-            return;
-        }
-        try {
-            if (await) {
-                while (true) {
-                    FrameworkEvent event = framework.waitForStop(0);
-                    if (event.getType() != FrameworkEvent.STOPPED_UPDATE) {
-                        break;
-                    }
-                }
-            }
-            exiting = true;
-            if (framework.getState() == Bundle.ACTIVE) {
-                framework.stop();
-            }
-        } 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 {
-        final Main main = new Main(args);
-        try {
-            main.launch();
-        } catch (Throwable ex) {
-            main.setExitCode(-1);
-            System.err.println("Could not create framework: " + ex);
-            ex.printStackTrace();
-        }        
-        try {
-            main.destroy(true);
-        } catch (Throwable ex) {
-            main.setExitCode(-2);
-            System.err.println("Error occured shutting down framework: " + ex);
-            ex.printStackTrace();
-        } finally {
-            System.exit(main.getExitCode());
-        }
-    }
-
-    private static void processSecurityProperties(Properties m_configProps) {
-        String prop = m_configProps.getProperty("org.apache.felix.karaf.security.providers");
-        if (prop != null) {
-            String[] providers = prop.split(",");
-            for (String provider : providers) {
-                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("storage.location");
-                if (storage == null) {
-                    throw new Exception("System property 'storage.location' is not set. \n" +
-                        "This property needs to be set to the full path of the instance.properties file.");
-                }
-                File storageFile = new File(storage);
-                File propertiesFile = new File(storageFile, "instance.properties");
-                Properties props = new Properties();
-                if (propertiesFile.exists()) {
-                    FileInputStream fis = new FileInputStream(propertiesFile);
-                    props.load(fis);
-                    int count = Integer.parseInt(props.getProperty("count"));
-                    for (int i = 0; i < count; i++) {
-                        String name = props.getProperty("item." + i + ".name");
-                        if (name.equals(instanceName)) {
-                            props.setProperty("item." + i + ".pid", pid);
-                            FileOutputStream fos = new FileOutputStream(propertiesFile);
-                            props.store(fos, null);
-                            fis.close();
-                            fos.close();
-                            return;
-                        }
-                    }
-                    fis.close();
-                    if (!isRoot) {
-                        throw new Exception("Instance " + instanceName + " not found");
-                    } 
-                } else if (isRoot) {
-                    if (!propertiesFile.getParentFile().exists()) {
-                        try {
-                            propertiesFile.getParentFile().mkdirs();
-                        } catch (SecurityException se) {
-                            throw new Exception(se.getMessage());
-                        }
-                    }
-                    props.setProperty("count", "1");
-                    props.setProperty("item.0.name", instanceName);
-                    props.setProperty("item.0.loc", karafHome.getAbsolutePath());
-                    props.setProperty("item.0.pid", pid);
-                    props.setProperty("item.0.root", "true");
-                    FileOutputStream fos = new FileOutputStream(propertiesFile);
-                    props.store(fos, null);
-                    fos.close();
-                }
-            }
-        } catch (Exception e) {
-            System.err.println("Unable to update instance pid: " + e.getMessage());
-        }
-    }
-
-    /**
-     * <p/>
-     * Processes the auto-install and auto-start properties from the
-     * specified configuration properties.
-     */
-    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);
-
-        // 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);
-
-        // 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 two passes, first it installs
-        // them, then it starts them.
-            List<Bundle> bundlesToStart = autoInstall(PROPERTY_AUTO_START, context, sl, convertToMavenUrls);
-        // Now loop through and start the installed bundles.
-        for (Bundle b : bundlesToStart) {
-            try {
-                b.start();
-            }
-            catch (Exception ex) {
-                System.err.println("Auto-properties start: " + ex);
-            }
-        }
-    }
-
-    private List<Bundle> autoInstall(String propertyPrefix, BundleContext context, StartLevel sl, boolean convertToMavenUrls) {
-        Map<Integer, String> autoStart = new TreeMap<Integer, String>();
-        List<Bundle> bundles = new ArrayList<Bundle>();
-        for (Iterator i = configProps.keySet().iterator(); i.hasNext();) {
-            String key = (String) i.next();
-            // 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 = null;
-                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("Auto-properties install:" + ex);
-                        }
-                    }
-                }
-                while (location != null);
-            }
-        }
-        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 groupId = null;
-                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 = null;
-            boolean inQuote = false;
-            boolean tokStarted = false;
-            boolean exit = false;
-            while ((st.hasMoreTokens()) && (!exit)) {
-                tok = st.nextToken(tokenList);
-                if (tok.equals("\"")) {
-                    inQuote = !inQuote;
-                    if (inQuote) {
-                        tokenList = "\"";
-                    } else {
-                        tokenList = "\" ";
-                    }
-
-                } else if (tok.equals(" ")) {
-                    if (tokStarted) {
-                        retVal = tokBuf.toString();
-                        tokStarted = false;
-                        tokBuf = new StringBuffer(10);
-                        exit = true;
-                    }
-                } else {
-                    tokStarted = true;
-                    tokBuf.append(tok.trim());
-                }
-            }
-
-            // Handle case where end of token stream and
-            // still got data
-            if ((!exit) && (tokStarted)) {
-                retVal = tokBuf.toString();
-            }
-        }
-
-        return retVal;
-    }
-
-    /**
-     * <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>
-     */
-    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 = null;
-        try {
-            File file = new File(new File(karafBase, "etc"), SYSTEM_PROPERTIES_FILE_NAME);
-            propURL = file.toURL();
-        }
-        catch (MalformedURLException ex) {
-            System.err.print("Main: " + ex);
-            return;
-        }
-
-        // Read the properties file.
-        Properties props = new Properties();
-        InputStream is = null;
-        try {
-            is = propURL.openConnection().getInputStream();
-            props.load(is);
-            is.close();
-        }
-        catch (FileNotFoundException ex) {
-            // Ignore file not found.
-        }
-        catch (Exception ex) {
-            System.err.println(
-                    "Main: Error loading system properties from " + propURL);
-            System.err.println("Main: " + ex);
-            try {
-                if (is != null) is.close();
-            }
-            catch (IOException ex2) {
-                // Nothing we can do.
-            }
-            return;
-        }
-
-        // Perform variable substitution on specified properties.
-        for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
-            String name = (String) e.nextElement();
-            String value = System.getProperty(name, props.getProperty(name));
-            System.setProperty(name, substVars(value, name, null, null));
-        }
-    }
-
-    /**
-     * <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 
-     */
-    private Properties loadConfigProperties() 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.
-
-            ArrayList<File> bundleDirs = new ArrayList<File>();
-
-        // See if the property URL was specified as a property.
-        URL configPropURL = null;
-        URL startupPropURL = null;
-
-        try {
-            File file = new File(new File(karafBase, "etc"), CONFIG_PROPERTIES_FILE_NAME);
-            configPropURL = file.toURI().toURL();
-
-            file = new File(new File(karafBase, "etc"), STARTUP_PROPERTIES_FILE_NAME);
-            startupPropURL = file.toURI().toURL();
-
-        }
-        catch (MalformedURLException ex) {
-            System.err.print("Main: " + ex);
-            return null;
-        }
-
-
-        Properties configProps = loadPropertiesFile(configPropURL);
-        Properties startupProps = loadPropertiesFile(startupPropURL);
-
-        String defaultRepo = System.getProperty(DEFAULT_REPO, "system");
-
-        if (karafBase.equals(karafHome)) {
-            bundleDirs.add(new File(karafHome, defaultRepo));
-        } else {
-            bundleDirs.add(new File(karafBase, defaultRepo));
-            bundleDirs.add(new File(karafHome, defaultRepo));
-        }
-
-        String locations = configProps.getProperty(BUNDLE_LOCATIONS);
-
-        if (locations != null) {
-            StringTokenizer st = new StringTokenizer(locations, "\" ", true);
-            if (st.countTokens() > 0) {
-                String location = null;
-                do {
-                    location = nextLocation(st);
-                    if (location != null) {
-                        File f = new File(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);
-            }
-        }
-
-        // 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));
-        }
-
-        // Mutate properties
-        Main.processConfigurationProperties(configProps, startupProps, bundleDirs);
-
-        return configProps;
-    }
-
-    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 (FileNotFoundException ex) {
-        	if (configPropURL.getFile().lastIndexOf(STARTUP_PROPERTIES_FILE_NAME) != -1) {
-        		throw ex;
-        	}
-        }
-        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;
-    }
-
-    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 void updateClassLoader(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());
-        }
-
-        URLClassLoader classLoader = (URLClassLoader) Main.class.getClassLoader();
-        Method mth = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
-        mth.setAccessible(true);
-        mth.invoke(classLoader, bundleFile.toURL());
-
-    }
-
-    /**
-     * Process properties to customize default felix behavior
-     *
-     * @param startupProps
-     */
-    private static void processConfigurationProperties(Properties props, Properties startupProps, ArrayList<File> bundleDirs) {
-        if (bundleDirs == null) {
-            return;
-        }
-        if ("all".equals(props.getProperty(PROPERTY_AUTO_START, "").trim())) {
-            props.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.toURL().toString()).append("\" ");
-                } catch (MalformedURLException e) {
-                    System.err.print("Ignoring " + jar.toString() + " (" + e + ")");
-                }
-            }
-
-            props.setProperty(PROPERTY_AUTO_START, sb.toString());
-
-        } else if (STARTUP_PROPERTIES_FILE_NAME.equals(props.getProperty(PROPERTY_AUTO_START, "").trim())) {
-            props.remove(PROPERTY_AUTO_START);
-            // We should start the bundles in the startup.properties file.
-            HashMap<Integer, StringBuffer> levels = new HashMap<Integer, StringBuffer>();
-            for (Iterator iterator = startupProps.keySet().iterator(); iterator.hasNext();) {
-                String name = (String) iterator.next();
-                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.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);
-                }
-            }
-
-            for (Map.Entry<Integer, StringBuffer> entry : levels.entrySet()) {
-                props.setProperty(PROPERTY_AUTO_START + "." + entry.getKey(), entry.getValue().toString());
-            }
-        }
-
-    }
-
-    private static File findFile(ArrayList<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;
-    }
-
-    /* (non-Javadoc)
-      * @see org.apache.felix.karaf.main.MainService#getArgs()
-      */
-    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"))) {
-                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);
-                for (;;) {
-                    if (lock.lock()) {
-                        if (lockLogged) {
-                            LOG.info("Lock acquired.");
-                        }
-                        setupShutdown(props);
-                        setStartLevel(defaultStartLevel);
-                        for (;;) {
-                            if (!lock.isAlive()) {
-                                break;
-                            }
-                            Thread.sleep(lockDelay);
-                        }
-                        if (framework.getState() == Bundle.ACTIVE && !exiting) {
-                            LOG.info("Lost the lock, stopping this instance ...");
-                            setStartLevel(lockStartLevel);
-                        }
-                    } else if (!lockLogged) {
-                        LOG.info("Waiting for the lock ...");
-                        lockLogged = true;
-                    }
-                    Thread.sleep(lockDelay);
-                } 
-            } else {
-                setStartLevel(defaultStartLevel);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    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) {
-        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();
-        }
-        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 Thread() {
-                    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 = -1;
-                                    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) {
-                            }
-                        }
-                    }
-                };
-                thread.setDaemon(true);
-                thread.start();
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-}
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/MySQLJDBCLock.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/MySQLJDBCLock.java
deleted file mode 100644
index 86cc83f..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/MySQLJDBCLock.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.felix.karaf.main;
-
-import java.sql.Connection;
-import java.util.Properties;
-
-/**
- * Represents an exclusive lock on a database,
- * used to avoid multiple Karaf instances attempting
- * to become master.
- * 
- * @version $Revision: $
- */
-public class MySQLJDBCLock extends DefaultJDBCLock {
-
-    public MySQLJDBCLock(Properties props) {
-        super(props);
-    }
-
-    Statements createStatements() {
-        Statements statements = new Statements();
-        statements.setTableName(table);
-        statements.setNodeName(clusterName);
-        String[] lockCreateSchemaStatements = statements.getLockCreateSchemaStatements(getCurrentTimeMillis());
-        for (int index = 0; index < lockCreateSchemaStatements.length; index++) {
-            if (lockCreateSchemaStatements[index].toUpperCase().startsWith("CREATE TABLE")) {
-                lockCreateSchemaStatements[index] = lockCreateSchemaStatements[index] + " ENGINE=INNODB";
-            }
-        }
-        return statements;
-    }
-    
-    @Override
-    Connection createConnection(String driver, String url, String username, String password) throws Exception {
-        url = (url.toLowerCase().contains("createDatabaseIfNotExist=true")) ? 
-            url : 
-            ((url.contains("?")) ? 
-                url + "&createDatabaseIfNotExist=true" : 
-                url + "?createDatabaseIfNotExist=true");
-        
-        return super.createConnection(driver, url, username, password);
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/OracleJDBCLock.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/OracleJDBCLock.java
deleted file mode 100644
index bcf72f7..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/OracleJDBCLock.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.felix.karaf.main;
-
-import java.util.Properties;
-
-/**
- * Represents an exclusive lock on a database,
- * used to avoid multiple Karaf instances attempting
- * to become master.
- * 
- * @version $Revision: $
- */
-public class OracleJDBCLock extends DefaultJDBCLock {
-    
-    private static final String MOMENT_COLUMN_DATA_TYPE = "NUMBER(20)";
-
-    public OracleJDBCLock(Properties props) {
-        super(props);
-    }
-
-    @Override
-    Statements createStatements() {
-        Statements statements = new Statements();
-        statements.setTableName(table);
-        statements.setNodeName(clusterName);
-        statements.setMomentColumnDataType(MOMENT_COLUMN_DATA_TYPE);
-        return statements;
-    }
-    
-    /**
-     * When we perform an update on a long lived locked table, Oracle will save
-     * a copy of the transaction in it's UNDO table space. Eventually this can
-     * cause the UNDO table to become full, disrupting all locks in the DB instance.
-     * A select query just touches the table, ensuring we can still read the DB but
-     * doesn't add to the UNDO. 
-     */
-    @Override
-    public boolean lock() {
-        return aquireLock();
-    }
-    
-    /**
-     * When we perform an update on a long lived locked table, Oracle will save
-     * a copy of the transaction in it's UNDO table space. Eventually this can
-     * cause the UNDO table to become full, disrupting all locks in the DB instance.
-     * A select query just touches the table, ensuring we can still read the DB but
-     * doesn't add to the UNDO. 
-     */
-    @Override
-    boolean updateLock() {
-        return aquireLock();
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/SimpleFileLock.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/SimpleFileLock.java
deleted file mode 100644
index c6fd1fa..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/SimpleFileLock.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.felix.karaf.main;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.channels.FileLock;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-public class SimpleFileLock implements Lock {
-
-    private static final Logger LOG = Logger.getLogger(SimpleFileLock.class.getName());
-    private static final String PROPERTY_LOCK_DIR = "karaf.lock.dir";
-    private static final String PROP_KARAF_BASE = "karaf.base";
-    private RandomAccessFile lockFile;
-    private FileLock lock;
-
-    public SimpleFileLock(Properties props) {
-        try {
-
-            LOG.addHandler( BootstrapLogManager.getDefaultHandler() );
-            String lock = props.getProperty(PROPERTY_LOCK_DIR);
-
-            if (lock != null) {
-                File karafLock = getKarafLock(new File(lock), props);
-                props.setProperty(PROPERTY_LOCK_DIR, karafLock.getPath());
-            } else {
-                props.setProperty(PROPERTY_LOCK_DIR, System.getProperty(PROP_KARAF_BASE));
-            }
-
-            File base = new File(props.getProperty(PROPERTY_LOCK_DIR));
-            lockFile = new RandomAccessFile(new File(base, "lock"), "rw");
-        } catch (IOException e) {
-            throw new RuntimeException("Could not create file lock", e);
-        }
-    }
-
-    public boolean lock() throws Exception {
-        LOG.info("locking");
-        if (lock == null) {
-            lock = lockFile.getChannel().tryLock();
-        }
-        return lock != null;
-    }
-
-    public void release() throws Exception {
-        LOG.info("releasing");
-        if (lock != null && lock.isValid()) {
-            lock.release();
-            lock.channel().close();
-        }
-        lock = null;
-    }
- 
-    public boolean isAlive() throws Exception {
-        return lock != null;
-    }
-
-    private static File getKarafLock(File lock,Properties props) {
-        File rc = null;
-
-        String path = lock.getPath();
-        if (path != null) {
-            rc = validateDirectoryExists(path, "Invalid " + PROPERTY_LOCK_DIR + " system property");
-        }
-
-        if (rc == null) {
-            path = props.getProperty(PROP_KARAF_BASE);
-            if (path != null) {
-                rc = validateDirectoryExists(path, "Invalid " + PROP_KARAF_BASE + " property");
-            }
-        }
-
-        if (rc == null) {
-            rc = lock;
-        }
-        return rc;
-    }
-
-    private static File validateDirectoryExists(String path, String errPrefix) {
-        File rc;
-        try {
-            rc = new File(path).getCanonicalFile();
-        } catch (IOException e) {
-            throw new IllegalArgumentException(errPrefix + " '" + path + "' : " + e.getMessage());
-        }
-        if (!rc.exists()) {
-            throw new IllegalArgumentException(errPrefix + " '" + path + "' : does not exist");
-        }
-        if (!rc.isDirectory()) {
-            throw new IllegalArgumentException(errPrefix + " '" + path + "' : is not a directory");
-        }
-        return rc;
-    }
-
-}
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/Statements.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/Statements.java
deleted file mode 100644
index 251d6c4..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/Statements.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.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;
-    
-    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;
-    }
-
-    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;
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/Stop.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/Stop.java
deleted file mode 100644
index b3c9b2c..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/Stop.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.felix.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.getKarafBase(karafHome);
-
-        System.setProperty(Main.PROP_KARAF_HOME, karafHome.getPath());
-        System.setProperty(Main.PROP_KARAF_BASE, karafBase.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);
-        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/main/src/main/java/org/apache/felix/karaf/main/StringMap.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/StringMap.java
deleted file mode 100644
index 4ef648f..0000000
--- a/karaf/main/src/main/java/org/apache/felix/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.felix.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/main/src/main/java/org/apache/felix/karaf/main/Utils.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/Utils.java
deleted file mode 100644
index 61c03ee..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/Utils.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.felix.karaf.main;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.net.JarURLConnection;
-import java.net.URI;
-
-import org.apache.felix.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");
-        }
-
-        if (rc == null) {
-            path = System.getenv(Main.ENV_KARAF_HOME);
-            if (path != null) {
-                rc = validateDirectoryExists(path, "Invalid " + Main.ENV_KARAF_HOME + " environment variable");
-            }
-        }
-
-        // 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) {
-        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;
-    }
-
-    public static File getKarafBase(File defaultValue) {
-        File rc = null;
-
-        String path = System.getProperty(Main.PROP_KARAF_BASE);
-        if (path != null) {
-            rc = validateDirectoryExists(path, "Invalid " + Main.PROP_KARAF_BASE + " system property");
-        }
-
-        if (rc == null) {
-            path = System.getenv(Main.ENV_KARAF_BASE);
-            if (path != null) {
-                rc = validateDirectoryExists(path, "Invalid " + Main.ENV_KARAF_BASE + " environment variable");
-            }
-        }
-
-        if (rc == null) {
-            rc = defaultValue;
-        }
-        return rc;
-    }
-}
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/spi/MainService.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/spi/MainService.java
deleted file mode 100644
index f72c207..0000000
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/spi/MainService.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.felix.karaf.main.spi;
-
-public interface MainService {
-
-	public abstract String[] getArgs();
-	public int getExitCode();
-	public void setExitCode(int exitCode);
-
-}
diff --git a/karaf/main/src/main/resources/config.properties b/karaf/main/src/main/resources/config.properties
deleted file mode 100644
index 6fe20f9..0000000
--- a/karaf/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/main/src/test/java/org/apache/felix/karaf/main/BaseJDBCLockIntegrationTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/BaseJDBCLockIntegrationTest.java
deleted file mode 100644
index eae8d19..0000000
--- a/karaf/main/src/test/java/org/apache/felix/karaf/main/BaseJDBCLockIntegrationTest.java
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.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 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());
-    }
-
-    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);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/BaseJDBCLockTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/BaseJDBCLockTest.java
deleted file mode 100644
index 8f9de04..0000000
--- a/karaf/main/src/test/java/org/apache/felix/karaf/main/BaseJDBCLockTest.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.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);
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/DefaultJDBCLockIntegrationTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/DefaultJDBCLockIntegrationTest.java
deleted file mode 100644
index c2d586d..0000000
--- a/karaf/main/src/test/java/org/apache/felix/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.felix.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));
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/DefaultJDBCLockTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/DefaultJDBCLockTest.java
deleted file mode 100644
index 101aa20..0000000
--- a/karaf/main/src/test/java/org/apache/felix/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.felix.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;
-            }
-        };
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/DerbyJDBCLockIntegrationTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/DerbyJDBCLockIntegrationTest.java
deleted file mode 100644
index d176edc..0000000
--- a/karaf/main/src/test/java/org/apache/felix/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.felix.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));
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/DerbyJDBCLockTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/DerbyJDBCLockTest.java
deleted file mode 100644
index 548937f..0000000
--- a/karaf/main/src/test/java/org/apache/felix/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.felix.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;
-            }
-        };
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/MySQLJDBCLockIntegrationTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/MySQLJDBCLockIntegrationTest.java
deleted file mode 100644
index 4b5f7ca..0000000
--- a/karaf/main/src/test/java/org/apache/felix/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.felix.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);
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/MySQLJDBCLockTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/MySQLJDBCLockTest.java
deleted file mode 100644
index 112701a..0000000
--- a/karaf/main/src/test/java/org/apache/felix/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.felix.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;
-            }
-        };
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/OracleJDBCLockIntegrationTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/OracleJDBCLockIntegrationTest.java
deleted file mode 100644
index 08bacc2..0000000
--- a/karaf/main/src/test/java/org/apache/felix/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.felix.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;
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/OracleJDBCLockTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/OracleJDBCLockTest.java
deleted file mode 100644
index c4c96d8..0000000
--- a/karaf/main/src/test/java/org/apache/felix/karaf/main/OracleJDBCLockTest.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.felix.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();
-        
-        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();
-        
-        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);
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/StatementsTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/StatementsTest.java
deleted file mode 100644
index 87e31a8..0000000
--- a/karaf/main/src/test/java/org/apache/felix/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.felix.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)");
-    }
-}
\ No newline at end of file
diff --git a/karaf/main/src/test/java/org/apache/felix/karaf/main/StringMapTest.java b/karaf/main/src/test/java/org/apache/felix/karaf/main/StringMapTest.java
deleted file mode 100644
index 9ce6389..0000000
--- a/karaf/main/src/test/java/org/apache/felix/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.felix.karaf.main;
-
-import junit.framework.TestCase;
-
-/**
- * Test cased for {@link org.apache.felix.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/management/NOTICE b/karaf/management/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/management/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/management/pom.xml b/karaf/management/pom.xml
deleted file mode 100644
index 5c62e99..0000000
--- a/karaf/management/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/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf</groupId>
-    <artifactId>org.apache.felix.karaf.management</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Management</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</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>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Import-Package>
-                            !${project.artifactId}*,
-                            javax.management,
-                            *
-                        </Import-Package>
-                        <Export-Package>${project.artifactId}*;version=${project.version}</Export-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-       </plugins>
-    </build>
-
-
-</project>
diff --git a/karaf/management/src/main/java/org/apache/felix/karaf/management/ConnectorServerFactory.java b/karaf/management/src/main/java/org/apache/felix/karaf/management/ConnectorServerFactory.java
deleted file mode 100644
index 4ab9f39..0000000
--- a/karaf/management/src/main/java/org/apache/felix/karaf/management/ConnectorServerFactory.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.felix.karaf.management;
-
-import java.io.IOException;
-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;
-
-public class ConnectorServerFactory {
-
-    private MBeanServer server;
-    private String serviceUrl;
-    private Map environment;
-    private ObjectName objectName;
-    private boolean threaded = false;
-    private boolean daemon = false;
-    private JMXConnectorServer connectorServer;
-
-    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 void init() throws Exception {
-        if (this.server == null) {
-            throw new IllegalArgumentException("server must be set");
-        }
-        JMXServiceURL url = new JMXServiceURL(this.serviceUrl);
-        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 {
-                            connectorServer.start();
-                        } catch (IOException ex) {
-                            throw new RuntimeException("Could not start JMX connector server", ex);
-                        }
-                    }
-                };
-                connectorThread.setName("JMX Connector Thread [" + this.serviceUrl + "]");
-                connectorThread.setDaemon(this.daemon);
-                connectorThread.start();
-            }
-            else {
-                this.connectorServer.start();
-            }
-        } catch (Exception ex) {
-            doUnregister(this.objectName);
-            throw ex;
-        }
-    }
-
-    public void destroy() throws Exception {
-        try {
-            this.connectorServer.stop();
-        } finally {
-            doUnregister(this.objectName);
-        }
-    }
-
-    protected void doUnregister(ObjectName objectName) {
-        try {
-            if (this.objectName != null && this.server.isRegistered(objectName)) {
-                this.server.unregisterMBean(objectName);
-            }
-        }
-        catch (JMException ex) {
-            // Ignore
-        }
-    }
-}
diff --git a/karaf/management/src/main/java/org/apache/felix/karaf/management/JaasAuthenticator.java b/karaf/management/src/main/java/org/apache/felix/karaf/management/JaasAuthenticator.java
deleted file mode 100644
index a3897ed..0000000
--- a/karaf/management/src/main/java/org/apache/felix/karaf/management/JaasAuthenticator.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.felix.karaf.management;
-
-import java.io.IOException;
-
-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.LoginContext;
-import javax.security.auth.login.LoginException;
-
-public class JaasAuthenticator implements JMXAuthenticator {
-
-    private String realm;
-
-    public String getRealm() {
-        return realm;
-    }
-
-    public void setRealm(String realm) {
-        this.realm = realm;
-    }
-
-    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 {
-            LoginContext loginContext = new LoginContext(realm, 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();
-            return loginContext.getSubject();
-        } catch (LoginException e) {
-            throw new SecurityException("Authentication failed", e);
-        }
-    }
-}
diff --git a/karaf/management/src/main/java/org/apache/felix/karaf/management/MBeanRegistrer.java b/karaf/management/src/main/java/org/apache/felix/karaf/management/MBeanRegistrer.java
deleted file mode 100644
index 10645c6..0000000
--- a/karaf/management/src/main/java/org/apache/felix/karaf/management/MBeanRegistrer.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.karaf.management;
-
-import java.util.Map;
-
-import javax.management.JMException;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
-
-public class MBeanRegistrer {
-
-    private MBeanServer mbeanServer;
-
-    private Map<Object, String> mbeans;
-
-    public void setMbeans(Map<Object, String> mbeans) {
-        this.mbeans = mbeans;
-    }
-
-    public void registerMBeanServer(MBeanServer mbeanServer) throws JMException {
-        if (this.mbeanServer != mbeanServer) {
-            unregisterMBeans();
-        }
-        this.mbeanServer = mbeanServer;
-        registerMBeans();
-    }
-
-    public void unregisterMBeanServer(MBeanServer mbeanServer) throws JMException {
-        unregisterMBeans();
-        this.mbeanServer = null;
-    }
-
-    public void init() throws Exception {
-        registerMBeans();
-    }
-
-    protected void registerMBeans() throws JMException {
-        if (mbeanServer != null && mbeans != null) {
-            for (Map.Entry<Object, String> entry : mbeans.entrySet()) {
-                String value = parseProperty(entry.getValue());
-                mbeanServer.registerMBean(entry.getKey(), new ObjectName(value));
-            }
-        }
-    }
-
-    protected void unregisterMBeans() throws JMException {
-        if (mbeanServer != null && mbeans != null) {
-            for (Map.Entry<Object, String> entry : mbeans.entrySet()) {
-                String value = parseProperty(entry.getValue());
-                mbeanServer.unregisterMBean(new ObjectName(value));
-            }
-        }
-    }
-
-    protected String parseProperty(String raw) {
-        if (raw.indexOf("${") > -1 && raw.indexOf("}", raw.indexOf("${")) > -1) {
-            String var = raw.substring(raw.indexOf("${") + 2, raw.indexOf("}"));
-            String val = System.getProperty(var);
-            if (val != null) {
-                raw = raw.replace("${" + var + "}", val);
-            }
-        }
-        return raw;
-    }
-}
diff --git a/karaf/management/src/main/java/org/apache/felix/karaf/management/MBeanServerFactory.java b/karaf/management/src/main/java/org/apache/felix/karaf/management/MBeanServerFactory.java
deleted file mode 100644
index 6bbc780..0000000
--- a/karaf/management/src/main/java/org/apache/felix/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.felix.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/management/src/main/java/org/apache/felix/karaf/management/RmiRegistryFactory.java b/karaf/management/src/main/java/org/apache/felix/karaf/management/RmiRegistryFactory.java
deleted file mode 100644
index 640789a..0000000
--- a/karaf/management/src/main/java/org/apache/felix/karaf/management/RmiRegistryFactory.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.felix.karaf.management;
-
-import java.rmi.RemoteException;
-import java.rmi.registry.LocateRegistry;
-import java.rmi.registry.Registry;
-import java.rmi.server.UnicastRemoteObject;
-
-/**
- * 
- * @author gnodet
- */
-public class RmiRegistryFactory {
-
-    private int port = Registry.REGISTRY_PORT;
-    private Registry registry;
-    private boolean locate;
-    private boolean create = true;
-    private boolean locallyCreated;
-    
-    /**
-     * @return the create
-     */
-    public boolean isCreate() {
-        return create;
-    }
-
-    /**
-     * @param create the create to set
-     */
-    public void setCreate(boolean create) {
-        this.create = create;
-    }
-
-    /**
-     * @return the locate
-     */
-    public boolean isLocate() {
-        return locate;
-    }
-
-    /**
-     * @param locate the locate to set
-     */
-    public void setLocate(boolean locate) {
-        this.locate = locate;
-    }
-
-    /**
-     * @return the port
-     */
-    public int getPort() {
-        return port;
-    }
-
-    /**
-     * @param port the port to set
-     */
-    public void setPort(int port) {
-        this.port = port;
-    }
-
-    public Object getObject() throws Exception {
-        return registry;
-    }
-
-    public void init() throws RemoteException {
-        if (registry == null && locate) {
-            try {
-                Registry reg = LocateRegistry.getRegistry(getPort());
-                reg.list();
-                registry = reg;
-            } catch (RemoteException e) {
-                // ignore
-            }
-        }
-        if (registry == null && create) {
-            registry = LocateRegistry.createRegistry(getPort());
-            locallyCreated = true;
-        }
-    }
-
-    public void destroy() throws RemoteException {
-        if (registry != null && locallyCreated) {
-            Registry reg = registry;
-            registry = null;
-            UnicastRemoteObject.unexportObject(reg, true);
-        }
-    }
-
-}
diff --git a/karaf/management/src/main/resources/OSGI-INF/blueprint/karaf-management.xml b/karaf/management/src/main/resources/OSGI-INF/blueprint/karaf-management.xml
deleted file mode 100644
index 49294b9..0000000
--- a/karaf/management/src/main/resources/OSGI-INF/blueprint/karaf-management.xml
+++ /dev/null
@@ -1,78 +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">
-
-    <!-- Allow the use of system properties -->
-    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]"/>
-
-    <!-- Property place holder -->
-    <cm:property-placeholder persistent-id="org.apache.felix.karaf.management">
-        <cm:default-properties>
-            <cm:property name="rmiRegistryPort" value="1099"/>
-            <cm:property name="jmxRealm" value="karaf"/>
-            <cm:property name="serviceUrl" value="service:jmx:rmi:///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"/>
-        </cm:default-properties>
-    </cm:property-placeholder>
-
-    <!-- MBeanServer bean -->
-    <bean id="mbeanServerFactory" class="org.apache.felix.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.felix.karaf.management.RmiRegistryFactory" init-method="init"
-          destroy-method="destroy">
-        <property name="create" value="true"/>
-        <property name="locate" value="true"/>
-        <property name="port" value="${rmiRegistryPort}"/>
-    </bean>
-
-    <!-- Create a JMX connector ServiceFactory -->
-    <bean id="connectorFactory" class="org.apache.felix.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>
-    </bean>
-
-    <!-- JAAS authenticator -->
-    <bean id="jaasAuthenticator" class="org.apache.felix.karaf.management.JaasAuthenticator">
-        <property name="realm" value="${jmxRealm}"/>
-    </bean>
-
-</blueprint>
-
diff --git a/karaf/management/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf/management/src/main/resources/OSGI-INF/metatype/metatype.properties
deleted file mode 100644
index 2869f52..0000000
--- a/karaf/management/src/main/resources/OSGI-INF/metatype/metatype.properties
+++ /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.
-#
-
-#
-# This file contains localization strings for configuration labels and
-# descriptions as used in the metatype.xml descriptor
-
-management.name = Apache Felix Karaf JMX Management
-management.description = Configuration of Apache Felix Karaf JMX Management
-
-rmiRegistryPort.name = RMI Port
-rmiRegistryPort.description = port of the registry for the exported RMI service
-
-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
-
diff --git a/karaf/management/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf/management/src/main/resources/OSGI-INF/metatype/metatype.xml
deleted file mode 100644
index e8d4bbd..0000000
--- a/karaf/management/src/main/resources/OSGI-INF/metatype/metatype.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.
-
--->
-<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.0.0" localization="OSGI-INF/metatype/metatype">
-    <OCD id="org.apache.felix.karaf.management" name="%management.name" description="%management.description">
-        <AD id="rmiRegistryPort" type="Integer" default="1099" name="%rmiRegistryPort.name"
-            description="%rmiRegistryPort.description"/>
-        <AD id="jmxRealm" type="String" default="karaf" name="%jmxRealm.name"
-            description="%jmxRealm.description"/>
-        <AD id="serviceUrl" type="String" default="service:jmx:rmi:///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"/>
-    </OCD>
-    <Designate pid="org.apache.felix.karaf.management">
-        <Object ocdref="org.apache.felix.karaf.management"/>
-    </Designate>
-</metatype:MetaData>
diff --git a/karaf/management/src/test/configs/factories/management.properties b/karaf/management/src/test/configs/factories/management.properties
deleted file mode 100644
index 3887ba8..0000000
--- a/karaf/management/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.felix.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/management/src/test/configs/services/org.ops4j.pax.logging.properties b/karaf/management/src/test/configs/services/org.ops4j.pax.logging.properties
deleted file mode 100644
index d1f34a6..0000000
--- a/karaf/management/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/management/src/test/java/org/apache/felix/karaf/management/MBeanRegistererTest.java b/karaf/management/src/test/java/org/apache/felix/karaf/management/MBeanRegistererTest.java
deleted file mode 100644
index dc95bdc..0000000
--- a/karaf/management/src/test/java/org/apache/felix/karaf/management/MBeanRegistererTest.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.felix.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;
-import org.junit.Assert;
-
-public class MBeanRegistererTest extends TestCase {
-    public void testRegistration() throws Exception {
-        IMocksControl control = createNiceControl();
-        MBeanServer mbeanServer = control.createMock(MBeanServer.class);
-        String rawName = "org.apache.felix.karaf:type=admin,name=${karaf.name}";
-        AdminServiceMBean mbean = control.createMock(AdminServiceMBean.class);
-        ObjectName name = new ObjectName("org.apache.felix.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/manual/NOTICE b/karaf/manual/NOTICE
deleted file mode 100644
index b8bf7cd..0000000
--- a/karaf/manual/NOTICE
+++ /dev/null
@@ -1,28 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-The PDF manual has been generated using http://www.princexml.com/
-and contains an attribution which should not be removed by
-licensee.
-
-This product includes software written by
-Hakon Wium Lie and Bert Bos.
-Licensed under the MIT License.
-
-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.
-
-III. License Summary
-- Apache License 2.0
-- MIT License
diff --git a/karaf/manual/pom.xml b/karaf/manual/pom.xml
deleted file mode 100644
index 5299a30..0000000
--- a/karaf/manual/pom.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-  <parent>
-    <groupId>org.apache.felix.karaf</groupId>
-    <artifactId>karaf</artifactId>
-    <version>1.7.0-SNAPSHOT</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.felix.karaf</groupId>
-  <artifactId>manual</artifactId>
-  <version>1.7.0-SNAPSHOT</version>
-  <packaging>pom</packaging>
-  <name>Apache Felix Karaf :: Manual</name>
-  <description>The Karaf Manual which generates a HTML and PDF representation of the manual.</description>
-
-  <properties>
-      <must-succeed>false</must-succeed>
-      
-      <manual.dir>${project.build.directory}/manual</manual.dir>
-      <manual>${manual.dir}/manual-${project.version}</manual>
-      <svn.root>${project.scm.connection}</svn.root>
-  </properties>
-
-  <build>
-    <plugins>
-        
-    <plugin>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <version>1.2</version>
-        <executions>
-            <execution>
-                <id>preprocess</id>
-                <configuration>
-                    <tasks>
-                        <taskdef name="if" classname="net.sf.antcontrib.logic.IfTask" classpathref="maven.plugin.classpath" />
-                        <taskdef name="for" classname="net.sf.antcontrib.logic.ForTask" classpathref="maven.plugin.classpath" />
-                        <taskdef name="trycatch" classname="net.sf.antcontrib.logic.TryCatchTask" classpathref="maven.plugin.classpath" />
-                        <property name="ant.regexp.regexpimpl" value="org.apache.tools.ant.util.regexp.Jdk14RegexpRegexp" />
-                        <mkdir dir="${manual.dir}" />
-                        <trycatch property="error">
-                            <try>
-                                <get src="https://cwiki.apache.org/confluence/display/FELIX/Karaf+Users'+Guide+in+one+page" dest="${manual}.temp" />
-                                <for list="1,2,3,4,5,6,7,8,9,10" param="letter">
-                                    <sequential>
-                                        <replaceregexp file="${manual}.temp" flags="g" match="&quot;/confluence/display/FELIX/([^&quot;]*)\+([^&quot;+]*)&quot;" replace="&quot;/confluence/display/FELIX/\1\2&quot;" />
-                                    </sequential>
-                                </for>
-                                <replaceregexp file="${manual}.temp" flags="g" match="&quot;/confluence/display/FELIX/([^&quot;]*)&quot;" replace="&quot;#KarafUsers%27Guideinonepage-\1&quot;" />
-                                <replaceregexp file="${manual}.temp" flags="g" match="&quot;/confluence/([^&quot;]*)&quot;" replace="&quot;http://cwiki.apache.org/confluence/\1&quot;" />
-                                <replaceregexp file="${manual}.temp" flags="g" match="&gt;top&lt;/a&gt;" replace="&gt;&lt;/a&gt;" />
-                                <java classname="org.ccil.cowan.tagsoup.CommandLine" classpathref="maven.plugin.classpath" fork="true" output="${manual}.temp2" logError="true">
-                                    <arg value="${manual}.temp" />
-                                </java>
-                                <xslt in="${manual}.temp2" out="${manual}.html" style="${basedir}/src/xslt/extract.xsl">
-                                    <param name="stylesheet" expression="${basedir}/src/styles/print.css" />
-                                </xslt>
-                                <exec executable="prince">
-                                    <arg value="${manual}.html" />
-                                    <arg value="${manual}.pdf" />
-                                </exec>
-                                <replace file="${manual}.html" token="${basedir}/src/styles/print.css" value="${svn.root}/src/styles/print.css" />
-                                <replace file="${manual}.html" token="scm:svn:" value="" />
-                            </try>
-                            <catch>
-                                <if>
-                                    <equals arg1="${must-succeed}" arg2="true" />
-                                    <then>
-                                        <echo>ERROR: ${error}</echo>
-                                        <fail>${error}</fail>
-                                    </then>
-                                    <else>
-                                        <echo>ERROR: ${error}</echo>
-                                        <echo>Falling back to dummy manuals</echo>
-                                        <copy file="src/fallback/manual.html" tofile="${manual}.html" />
-                                        <copy file="src/fallback/manual.pdf" tofile="${manual}.pdf" />
-                                    </else>
-                                </if>
-                            </catch>
-                        </trycatch>
-                    </tasks>
-                </configuration>
-                <goals>
-                    <goal>run</goal>
-                </goals>
-                <phase>generate-resources</phase>
-            </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>${manual}.html</file>
-                  <type>html</type>
-                </artifact>
-                <artifact>
-                  <file>${manual}.pdf</file>
-                  <type>pdf</type>
-                </artifact>
-              </artifacts>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>      
-    </plugins>
-  </build>
-
-  <profiles>
-      <profile>
-          <id>release</id>
-          <properties>
-              <must-succeed>true</must-succeed>
-          </properties>
-      </profile>
-  </profiles>
-
-</project>
\ No newline at end of file
diff --git a/karaf/manual/src/fallback/manual.html b/karaf/manual/src/fallback/manual.html
deleted file mode 100644
index 4aa3dbd..0000000
--- a/karaf/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/manual/src/fallback/manual.pdf b/karaf/manual/src/fallback/manual.pdf
deleted file mode 100644
index 72f3d80..0000000
--- a/karaf/manual/src/fallback/manual.pdf
+++ /dev/null
Binary files differ
diff --git a/karaf/manual/src/styles/chapter-rounded-bottom.png b/karaf/manual/src/styles/chapter-rounded-bottom.png
deleted file mode 100644
index 7b1d53d..0000000
--- a/karaf/manual/src/styles/chapter-rounded-bottom.png
+++ /dev/null
Binary files differ
diff --git a/karaf/manual/src/styles/print.css b/karaf/manual/src/styles/print.css
deleted file mode 100644
index b6f85af..0000000
--- a/karaf/manual/src/styles/print.css
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
-
-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; 
-}
-
diff --git a/karaf/manual/src/xslt/extract.xsl b/karaf/manual/src/xslt/extract.xsl
deleted file mode 100644
index d6f20dd..0000000
--- a/karaf/manual/src/xslt/extract.xsl
+++ /dev/null
@@ -1,46 +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.
--->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
-                xmlns:html="http://www.w3.org/1999/xhtml"
-                version="1.0"> 
-    <xsl:param name="stylesheet"/>
-    <xsl:template match="/">
-        <html xmlns="http://www.w3.org/1999/xhtml">
-            <head>
-                <link rel="stylesheet" type="text/css">
-                    <xsl:attribute name="href"><xsl:value-of select="$stylesheet"/></xsl:attribute>
-                </link>
-                <style type="text/css">
-                    @page :left {
-                      @top-left {
-                        content: "Apache Felix Karaf ${project.version} User's Manual";
-                      }
-                    }
-                </style>
-            </head>
-            <body>
-                <xsl:apply-templates select=".//html:div[@class='wiki-content']" />
-            </body>
-        </html>
-    </xsl:template>
-    <xsl:template match="@*|node()">
-        <xsl:copy>
-            <xsl:apply-templates select="@*|node()"/>
-        </xsl:copy>
-    </xsl:template>
-</xsl:stylesheet>
diff --git a/karaf/pom.xml b/karaf/pom.xml
deleted file mode 100644
index ca29478..0000000
--- a/karaf/pom.xml
+++ /dev/null
@@ -1,1120 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>felix-parent</artifactId>
-        <version>1.2.1</version>
-        <relativePath>../pom/pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.apache.felix.karaf</groupId>
-    <artifactId>karaf</artifactId>
-    <packaging>pom</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf</name>
-    <inceptionYear>2007</inceptionYear>
-
-    <modules>
-        <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>manual</module>
-        <module>exception</module>
-        <module>assembly</module>
-        <module>demos</module>
-        <module>itests</module>
-        <module>tooling</module>
-    </modules>
-
-    <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/felix/trunk/karaf</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/karaf</developerConnection>
-        <url>http://svn.apache.org/viewvc/felix/trunk/karaf/</url>
-    </scm>
-
-    <issueManagement>
-        <system>jira</system>
-        <url>https://issues.apache.org/jira/browse/FELIX/component/12312824</url>
-    </issueManagement>
-
-    <prerequisites>
-        <maven>2.0.7</maven>
-    </prerequisites>
-
-    <properties>
-        <aopalliance.version>1.0_3</aopalliance.version>
-        <cglib.version>2.1_3_4</cglib.version>
-        <commons.logging.version>1.1.1</commons.logging.version>
-        <depends.maven.plugin.version>1.0</depends.maven.plugin.version>
-        <easymock.version>2.4</easymock.version>
-        <equinox.version>3.5.1.v20090827</equinox.version>
-        <felix.bundlerepository.version>1.6.4</felix.bundlerepository.version>
-        <felix.compendium.version>1.2.0</felix.compendium.version>
-        <felix.configadmin.version>1.2.4</felix.configadmin.version>
-        <felix.fileinstall.version>3.0.0</felix.fileinstall.version>
-        <felix.framework.version>2.0.5</felix.framework.version>
-        <felix.gogo.version>0.4.0</felix.gogo.version>
-        <felix.osgi.version>1.4.0</felix.osgi.version>
-        <felix.plugin.version>2.1.0</felix.plugin.version>
-        <felix.prefs.version>1.0.4</felix.prefs.version>
-        <felix.utils.version>1.0.0</felix.utils.version>
-        <felix.webconsole.version>3.1.0</felix.webconsole.version>
-        <felix.metatype.version>1.0.2</felix.metatype.version>
-        <aries.blueprint.version>0.1-incubating</aries.blueprint.version>
-        <aries.jmx.version>0.1-incubating</aries.jmx.version>
-        <geronimo.servlet.version>1.1.2</geronimo.servlet.version>
-        <jansi.version>1.2</jansi.version>
-        <jetty.bundle.version>6.1.22_1</jetty.bundle.version>
-        <junit.version>4.7_1</junit.version>
-        <jline.version>0.9.95.20100209</jline.version>
-        <log4j.version>1.2.16</log4j.version>
-        <maven.version>2.0.9</maven.version>
-        <mina.version>2.0.0-RC1</mina.version>
-        <pax.exam.version>1.2.0</pax.exam.version>
-        <pax.logging.version>1.5.2</pax.logging.version>
-        <pax.runner.version>1.4.0</pax.runner.version>
-        <pax.url.version>1.1.2</pax.url.version>
-        <pax.web.version>0.7.2</pax.web.version>
-        <servlet.api.version>2.5</servlet.api.version>
-        <spring.osgi.version>1.2.0</spring.osgi.version>
-        <spring.version>2.5.6.SEC01</spring.version>
-        <sshd.version>0.4.0</sshd.version>
-        <xbean.version>3.7</xbean.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>
-        <!-- Apache snapshots -->
-        <repository>
-            <id>apache-snapshots</id>
-            <name>Apache Snapshots Repository</name>
-            <url>http://repository.apache.org/content/groups/snapshots-group</url>
-            <releases>
-                <enabled>false</enabled>
-            </releases>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-        </repository>
-        <!-- 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>jansi.release.m2</id>
-            <name>jansi Release Repository</name>
-            <url>http://jansi.fusesource.org/repo/release</url>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-        </repository>
-    </repositories>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.felix.karaf</groupId>
-                <artifactId>manual</artifactId>
-                <type>pdf</type>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf</groupId>
-                <artifactId>manual</artifactId>
-                <type>html</type>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf</groupId>
-                <artifactId>org.apache.felix.karaf.main</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf</groupId>
-                <artifactId>org.apache.felix.karaf.exception</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf</groupId>
-                <artifactId>org.apache.felix.karaf.client</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.deployer</groupId>
-                <artifactId>org.apache.felix.karaf.deployer.spring</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.deployer</groupId>
-                <artifactId>org.apache.felix.karaf.deployer.blueprint</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.deployer</groupId>
-                <artifactId>org.apache.felix.karaf.deployer.features</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.deployer</groupId>
-                <artifactId>org.apache.felix.karaf.deployer.war</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf</groupId>
-                <artifactId>org.apache.felix.karaf.management</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.demos</groupId>
-                <artifactId>demos</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.features</groupId>
-                <artifactId>org.apache.felix.karaf.features.core</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.features</groupId>
-                <artifactId>org.apache.felix.karaf.features.command</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.features</groupId>
-                <artifactId>org.apache.felix.karaf.features.management</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.admin</groupId>
-                <artifactId>org.apache.felix.karaf.admin.core</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.admin</groupId>
-                <artifactId>org.apache.felix.karaf.admin.command</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.admin</groupId>
-                <artifactId>org.apache.felix.karaf.admin.management</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.shell</groupId>
-                <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.shell</groupId>
-                <artifactId>org.apache.felix.karaf.shell.obr</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.shell</groupId>
-                <artifactId>org.apache.felix.karaf.shell.osgi</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.shell</groupId>
-                <artifactId>org.apache.felix.karaf.shell.log</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.shell</groupId>
-                <artifactId>org.apache.felix.karaf.shell.config</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.shell</groupId>
-                <artifactId>org.apache.felix.karaf.shell.packages</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.shell</groupId>
-                <artifactId>org.apache.felix.karaf.shell.ssh</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.shell</groupId>
-                <artifactId>org.apache.felix.karaf.shell.commands</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.shell</groupId>
-                <artifactId>org.apache.felix.karaf.shell.dev</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.shell</groupId>
-                <artifactId>org.apache.felix.karaf.shell.wrapper</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.jaas</groupId>
-                <artifactId>org.apache.felix.karaf.jaas.boot</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.jaas</groupId>
-                <artifactId>org.apache.felix.karaf.jaas.config</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.jaas</groupId>
-                <artifactId>org.apache.felix.karaf.jaas.modules</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.demos</groupId>
-                <artifactId>web</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf</groupId>
-                <artifactId>apache-felix-karaf</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf</groupId>
-                <artifactId>apache-felix-karaf</artifactId>
-                <type>zip</type>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf</groupId>
-                <artifactId>apache-felix-karaf</artifactId>
-                <classifier>features</classifier>
-                <type>xml</type>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.karaf.tooling</groupId>
-                <artifactId>org.apache.felix.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.apache.felix</groupId>
-                <artifactId>org.osgi.compendium</artifactId>
-                <version>${felix.compendium.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>org.osgi.foundation</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>javax.servlet</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>org.osgi.core</artifactId>
-                <version>${felix.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.prefs</artifactId>
-                <version>${felix.prefs.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>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>org.apache.felix.utils</artifactId>
-                <version>${felix.utils.version}</version>
-            </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>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <version>${felix.plugin.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.maven</groupId>
-                <artifactId>maven-plugin-api</artifactId>
-                <version>${maven.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.maven</groupId>
-                <artifactId>maven-project</artifactId>
-                <version>${maven.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-aop</artifactId>
-                <version>${spring.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.aopalliance</groupId>
-                        <artifactId>com.springsource.org.aopalliance</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-beans</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-core</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-context</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-test</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.osgi</groupId>
-                <artifactId>spring-osgi-core</artifactId>
-                <version>${spring.osgi.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>org.springframework.aop</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>org.springframework.beans</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>org.springframework.context</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>org.springframework.core</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.osgi</groupId>
-                <artifactId>spring-osgi-io</artifactId>
-                <version>${spring.osgi.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.osgi</groupId>
-                <artifactId>spring-osgi-extender</artifactId>
-                <version>${spring.osgi.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.osgi</groupId>
-                <artifactId>spring-osgi-annotation</artifactId>
-                <version>${spring.osgi.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.osgi</groupId>
-                <artifactId>spring-osgi-test</artifactId>
-                <version>${spring.osgi.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework.osgi</groupId>
-                        <artifactId>asm.osgi</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.junit</groupId>
-                        <artifactId>com.springsource.junit</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.objectweb.asm</groupId>
-                        <artifactId>com.springsource.org.objectweb.asm</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.servicemix.bundles</groupId>
-                <artifactId>org.apache.servicemix.bundles.junit</artifactId>
-                <version>${junit.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.servicemix.bundles</groupId>
-                <artifactId>org.apache.servicemix.bundles.jetty-bundle</artifactId>
-                <version>${jetty.bundle.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>log4j</groupId>
-                <artifactId>log4j</artifactId>
-                <version>${log4j.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>jline</groupId>
-                <artifactId>jline</artifactId>
-                <version>${jline.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.fusesource.jansi</groupId>
-                <artifactId>jansi</artifactId>
-                <version>${jansi.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-logging</groupId>
-                <artifactId>commons-logging</artifactId>
-                <version>${commons.logging.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>1.4.3</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-jdk14</artifactId>
-                <version>1.4.3</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-nop</artifactId>
-                <version>1.4.3</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-simple</artifactId>
-                <version>1.4.3</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.sshd</groupId>
-                <artifactId>sshd-core</artifactId>
-                <version>${sshd.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam-junit</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam-container-default</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam-junit-extender-impl</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse</groupId>
-                <artifactId>osgi</artifactId>
-                <version>${equinox.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>servlet-api</artifactId>
-                <version>${servlet.api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.blueprint</groupId>
-                <artifactId>org.apache.aries.blueprint</artifactId>
-                <version>${aries.blueprint.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>javax.servlet</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.jmx</groupId>
-                <artifactId>org.apache.aries.jmx</artifactId>
-                <version>${aries.jmx.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.jmx</groupId>
-                <artifactId>org.apache.aries.jmx.blueprint</artifactId>
-                <version>${aries.jmx.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.gogo</groupId>
-                <artifactId>org.apache.felix.gogo.runtime</artifactId>
-                <version>${felix.gogo.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix.gogo</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-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>
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <defaultGoal>install</defaultGoal>
-
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-eclipse-plugin</artifactId>
-                    <version>2.4</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.0</version>
-                    <configuration>
-                        <useReleaseProfile>false</useReleaseProfile>
-                        <preparationGoals>clean install</preparationGoals>
-                        <goals>deploy</goals>
-                        <arguments>-Prelease,deploy</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>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-idea-plugin</artifactId>
-                    <version>2.1</version>
-                    <configuration>
-                        <downloadSources>true</downloadSources>
-                        <downloadJavadocs>true</downloadJavadocs>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-surefire-plugin</artifactId>
-                    <version>2.3.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-shade-plugin</artifactId>
-                    <version>1.2</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-resources-plugin</artifactId>
-                    <version>2.3</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.servicemix.tooling</groupId>
-                    <artifactId>depends-maven-plugin</artifactId>
-                    <version>${depends.maven.plugin.version}</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-source-plugin</artifactId>
-                    <version>2.0.4</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-assembly-plugin</artifactId>
-                    <version>2.2-beta-3</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-antrun-plugin</artifactId>
-                    <version>1.2</version>
-                    <dependencies>
-                        <dependency>
-                            <groupId>ant-contrib</groupId>
-                            <artifactId>ant-contrib</artifactId>
-                            <version>1.0b3</version>
-                        </dependency>
-                        <dependency>
-                            <groupId>ant</groupId>
-                            <artifactId>ant-optional</artifactId>
-                            <version>1.5.3-1</version>
-                        </dependency>
-                        <dependency>
-                            <groupId>org.ccil.cowan.tagsoup</groupId>
-                            <artifactId>tagsoup</artifactId>
-                            <version>1.2</version>
-                        </dependency>
-                    </dependencies>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>exec-maven-plugin</artifactId>
-                    <version>1.1.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-dependency-plugin</artifactId>
-                    <version>2.1</version>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>2.0.2</version>
-                <configuration>
-                    <source>1.5</source>
-                    <target>1.5</target>
-                    <maxmem>256M</maxmem>
-                    <fork>${compiler.fork}</fork>
-                </configuration>
-            </plugin>
-            <plugin>
-                <artifactId>maven-remote-resources-plugin</artifactId>
-                <version>1.1</version>
-                <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>
-                            <tasks>
-                                <copy file="NOTICE" todir="target/maven-shared-archive-resources/META-INF" failonerror="false" overwrite="true" />
-                            </tasks>
-                        </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.3</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jxr-plugin</artifactId>
-                <version>2.0</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-site-plugin</artifactId>
-                <version>2.1</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-report-plugin</artifactId>
-                <version>2.5</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-project-info-reports-plugin</artifactId>
-                <version>2.1.2</version>
-            </plugin>
-        </plugins>
-    </reporting>
-
-    <profiles>
-        <profile>
-            <id>fastinstall</id>
-            <properties>
-                <maven.test.skip>true</maven.test.skip>
-            </properties>
-        </profile>
-        <profile>
-            <id>rat</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.rat</groupId>
-                        <artifactId>apache-rat-plugin</artifactId>
-                        <version>0.6</version>
-                        <executions>
-                            <execution>
-                                <phase>verify</phase>
-                                <goals>
-                                    <goal>check</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <reportFile>${project.build.directory}/${project.build.finalName}.rat</reportFile>
-                            <excludeSubProjects>false</excludeSubProjects>
-                            <excludes>
-                                <exclude>**/target/**/*</exclude>
-                                <!-- IDEA files -->
-                                <exclude>**/*.iml</exclude>
-                                <exclude>**/*.ipr</exclude>
-                                <exclude>**/*.iws</exclude>
-                                <!-- Eclipse files -->
-                                <exclude>**/.*</exclude>
-                                <exclude>**/eclipse-classes/**/*</exclude>
-                                <exclude>**/dependency-reduced-pom.xml</exclude>
-                                <!--RAT doesn't seem to recognize MIT style licenses-->
-                                <exclude>manual/src/styles/print.css</exclude>
-                            </excludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>release</id>
-            <build>
-                <plugins>
-                    <!-- We want to deploy the artifact to a staging location for perusal -->
-                    <plugin>
-                        <inherited>true</inherited>
-                        <artifactId>maven-deploy-plugin</artifactId>
-                        <version>2.3</version>
-                        <configuration>
-                            <altDeploymentRepository>${deploy.altRepository}</altDeploymentRepository>
-                            <updateReleaseInfo>true</updateReleaseInfo>
-                        </configuration>
-                    </plugin>
-                    <!-- We want to sign the artifact, the POM, and all attached artifacts -->
-                    <plugin>
-                        <artifactId>maven-gpg-plugin</artifactId>
-                        <version>1.0-alpha-4</version>
-                        <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>assembly</module>
-            </modules>
-            <properties>
-                <eclipse.workspace.dir>${basedir}/../workspace</eclipse.workspace.dir>
-            </properties>
-            <build>
-                <defaultGoal>eclipse:eclipse</defaultGoal>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-eclipse-plugin</artifactId>
-                        <inherited>false</inherited>
-                        <executions>
-                            <execution>
-                                <id>setup.eclipse.workspace</id>
-                                <phase>process-test-sources</phase>
-                                <goals>
-                                    <goal>add-maven-repo</goal>
-                                </goals>
-                                <configuration>
-                                    <workspace>${eclipse.workspace.dir}</workspace>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <defaultGoal>deploy</defaultGoal>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <version>2.0.4</version>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <version>2.4</version>
-                        <configuration>
-                            <source>1.5</source>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <id>attach-javadocs</id>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/karaf/shell/commands/NOTICE b/karaf/shell/commands/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/shell/commands/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/shell/commands/pom.xml b/karaf/shell/commands/pom.xml
deleted file mode 100644
index fa02b72..0000000
--- a/karaf/shell/commands/pom.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>org.apache.felix.karaf.shell.commands</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Shell Various Commands</name>
-
-    <description>
-        Provides SSH support to the console
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.gogo</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</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>
-        </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>
-                            !${project.artifactId}*,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/CatAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/CatAction.java
deleted file mode 100644
index 6767955..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/CatAction.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.felix.karaf.shell.commands;
-
-import java.io.IOException;
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.FileReader;
-import java.io.File;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.net.URI;
-import java.net.MalformedURLException;
-import java.util.List;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.gogo.commands.Command;
-
-/**
- * Concatenate and print files and/or URLs.
- *
- * @version $Rev: 593392 $ $Date: 2007-11-09 03:14:15 +0100 (Fri, 09 Nov 2007) $
- */
-@Command(scope = "shell", name = "cat", description = "Displays the content of a file or url")
-public class CatAction extends OsgiCommandSupport {
-
-    @Option(name = "-n", aliases = {}, description = "The 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 whitespaces (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/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ClearAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ClearAction.java
deleted file mode 100644
index 829f861..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/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.felix.karaf.shell.commands;
-
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-
-/**
- * A command to clear the console buffer
- */
-@Command(scope = "shell", name = "clear", description = "Clears the console buffer")
-public class ClearAction extends OsgiCommandSupport {
-
-	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/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/EachAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/EachAction.java
deleted file mode 100644
index eec57fa..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/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.felix.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.karaf.shell.console.OsgiCommandSupport;
-import org.osgi.service.command.Function;
-
-/**
- * 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 OsgiCommandSupport {
-
-    @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/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/EchoAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/EchoAction.java
deleted file mode 100644
index a5fa17c..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/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.felix.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.felix.karaf.shell.console.OsgiCommandSupport;
-
-@Command(scope = "shell", name = "echo", description="Echoes or prints arguments to STDOUT")
-public class EchoAction extends OsgiCommandSupport
-{
-    @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;
-    }
-}
\ No newline at end of file
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.java
deleted file mode 100644
index 3cd0d60..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.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.felix.karaf.shell.commands;
-
-import java.util.List;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.karaf.shell.commands.utils.PumpStreamHandler;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-
-/**
- * Execute system processes.
- *
- * @version $Rev: 593392 $ $Date: 2007-11-09 03:14:15 +0100 (Fri, 09 Nov 2007) $
- */
-@Command(scope = "shell", name = "exec", description = "Executes system processes")
-public class ExecuteAction extends OsgiCommandSupport {
-
-    @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);
-
-        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/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/GrepAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/GrepAction.java
deleted file mode 100644
index 2635eb6..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/GrepAction.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.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.felix.karaf.shell.console.OsgiCommandSupport;
-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")
-public class GrepAction extends OsgiCommandSupport {
-
-    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) {
-                            matcher2.appendReplacement(sb, Ansi.ansi()
-                                .bg(Ansi.Color.YELLOW)
-                                .fg(Ansi.Color.BLACK)
-                                .a(matcher2.group())
-                                .reset().toString());
-                        } else {
-                            matcher2.appendReplacement(sb, matcher2.group());
-                        }
-                        nb++;
-                    }
-                    matcher2.appendTail(sb);
-                    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;
-    }
-
-}
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/HistoryAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/HistoryAction.java
deleted file mode 100644
index ee5884b..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/HistoryAction.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.karaf.shell.commands;
-
-import java.util.List;
-
-import jline.History;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.fusesource.jansi.Ansi;
-
-/**
- * History command
- */
-@Command(scope = "shell", name="history", description="Prints command history")
-public class HistoryAction extends OsgiCommandSupport {
-
-    @Override
-    protected Object doExecute() throws Exception {
-        History history = (History) session.get(".jline.history");
-        List<String> elements = history.getHistoryList();
-
-        int i = 0;
-        for (String element : elements) {
-            System.out.println(
-                    Ansi.ansi()
-                        .a("  ")
-                        .a(Ansi.Attribute.INTENSITY_BOLD).render("%3d", i).a(Ansi.Attribute.INTENSITY_BOLD_OFF)
-                        .a("  ")
-                        .a(element)
-                        .toString());
-            i++;
-        }
-        return null;
-    }
-}
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/IfAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/IfAction.java
deleted file mode 100644
index d331ad0..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/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.felix.karaf.shell.commands;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.osgi.service.command.Function;
-
-/**
- * Execute a closure on a list of arguments.
- */
-@Command(scope = "shell", name = "if", description = "If/Then/Else block.")
-public class IfAction extends OsgiCommandSupport {
-
-    @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;
-    }
-
-}
\ No newline at end of file
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/InfoAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/InfoAction.java
deleted file mode 100644
index c415ea0..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/InfoAction.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.felix.karaf.shell.commands;
-
-import java.util.Locale;
-import java.text.DecimalFormatSymbols;
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
-import java.lang.management.OperatingSystemMXBean;
-import java.lang.management.ManagementFactory;
-import java.lang.management.ClassLoadingMXBean;
-import java.lang.management.MemoryMXBean;
-import java.lang.management.ThreadMXBean;
-import java.lang.management.RuntimeMXBean;
-import java.lang.management.GarbageCollectorMXBean;
-import java.lang.reflect.Method;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Command;
-import org.fusesource.jansi.Ansi;
-
-@Command(scope = "shell", name = "info", description = "Prints system informations")
-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));
-
-    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 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) {}
-
-        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) * 60);
-        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();
-    }
-
-}
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/JavaAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/JavaAction.java
deleted file mode 100644
index 47f81c6..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/JavaAction.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.felix.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.felix.karaf.shell.console.OsgiCommandSupport;
-
-/**
- * Execute a Java standard application.
- *
- * <p>By default looks for static main(String[]) to execute, but
- * you can specify a different static method that takes a String[]
- * to execute instead.
- *
- * @version $Rev: 593392 $ $Date: 2007-11-09 03:14:15 +0100 (Fri, 09 Nov 2007) $
- */
-@Command(scope = "shell", name = "java", description = "Execute a Java standard application")
-public class JavaAction extends OsgiCommandSupport {
-
-    @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/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/LogoutAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/LogoutAction.java
deleted file mode 100644
index 420f6e5..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/LogoutAction.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.felix.karaf.shell.commands;
-
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.karaf.shell.console.CloseShellException;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Command(scope = "shell", name = "logout", description = "Disconnect shell from current session")
-public class LogoutAction extends OsgiCommandSupport {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    protected Object doExecute() throws Exception {
-        log.info("Disconnecting from current session...");
-        throw new CloseShellException();
-    }
-
-}
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/MoreAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/MoreAction.java
deleted file mode 100644
index 567ba93..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/MoreAction.java
+++ /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.
- */
-package org.apache.felix.karaf.shell.commands;
-
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "shell", name = "more", description = "")
-public class MoreAction {
-}
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/NewAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/NewAction.java
deleted file mode 100644
index 04d9a93..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/NewAction.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.commands;
-
-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;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.karaf.shell.console.commands.GenericType;
-import org.osgi.service.blueprint.container.ComponentDefinitionException;
-import org.osgi.service.blueprint.container.Converter;
-import org.osgi.service.blueprint.container.ReifiedType;
-
-/**
- * Execute a closure on a list of arguments.
- */
-@Command(scope = "shell", name = "new", description = "Creates a new java object.")
-public class NewAction extends OsgiCommandSupport {
-
-    @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 Converter blueprintConverter;
-
-    public void setBlueprintConverter(Converter blueprintConverter) {
-        this.blueprintConverter = blueprintConverter;
-    }
-
-    @Override
-    protected Object doExecute() throws Exception {
-        // 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 ComponentDefinitionException("Error when instanciating object of class " + clazz.getName(), getRealCause(e));
-            }
-        } else if (matches.size() == 0) {
-            throw new ComponentDefinitionException("Unable to find a matching constructor on class " + clazz.getName() + " for arguments " + args + " when instanciating object.");
-        } else {
-            throw new ComponentDefinitionException("Multiple matching constructors found on class " + clazz.getName() + " for arguments " + args + " when instanciating object: " + matches.keySet());
-        }
-    }
-
-
-    //
-    // Code below comes from Aries blueprint implementation.  Given this code is not available
-    // from a public API it has been copied here.
-    //
-
-    private Object newInstance(Constructor constructor, Object... args) throws Exception {
-        return constructor.newInstance(args);
-    }
-
-    private Map<Constructor, List<Object>> findMatchingConstructors(Class type, List<Object> args, List<ReifiedType> types) {
-        Map<Constructor, List<Object>> matches = new HashMap<Constructor, List<Object>>();
-        // Get constructors
-        List<Constructor> constructors = new ArrayList<Constructor>(Arrays.asList(type.getConstructors()));
-        // Discard any signature with wrong cardinality
-        for (Iterator<Constructor> it = constructors.iterator(); it.hasNext();) {
-            if (it.next().getParameterTypes().length != args.size()) {
-                it.remove();
-            }
-        }
-        // Find a direct match with assignment
-        if (matches.size() != 1) {
-            Map<Constructor, List<Object>> nmatches = new HashMap<Constructor, List<Object>>();
-            for (Constructor cns : constructors) {
-                boolean found = true;
-                List<Object> match = new ArrayList<Object>();
-                for (int i = 0; i < args.size(); i++) {
-                    ReifiedType argType = new GenericType(cns.getGenericParameterTypes()[i]);
-                    if (types.get(i) != null && !argType.getRawClass().equals(types.get(i).getRawClass())) {
-                        found = false;
-                        break;
-                    }
-                    if (!isAssignable(args.get(i), argType)) {
-                        found = false;
-                        break;
-                    }
-                    try {
-                        match.add(convert(args.get(i), cns.getGenericParameterTypes()[i]));
-                    } catch (Throwable t) {
-                        found = false;
-                        break;
-                    }
-                }
-                if (found) {
-                    nmatches.put(cns, match);
-                }
-            }
-            if (nmatches.size() > 0) {
-                matches = nmatches;
-            }
-        }
-        // Find a direct match with conversion
-        if (matches.size() != 1) {
-            Map<Constructor, List<Object>> nmatches = new HashMap<Constructor, List<Object>>();
-            for (Constructor cns : constructors) {
-                boolean found = true;
-                List<Object> match = new ArrayList<Object>();
-                for (int i = 0; i < args.size(); i++) {
-                    ReifiedType argType = new GenericType(cns.getGenericParameterTypes()[i]);
-                    if (types.get(i) != null && !argType.getRawClass().equals(types.get(i).getRawClass())) {
-                        found = false;
-                        break;
-                    }
-                    try {
-                        Object val = convert(args.get(i), argType);
-                        match.add(val);
-                    } catch (Throwable t) {
-                        found = false;
-                        break;
-                    }
-                }
-                if (found) {
-                    nmatches.put(cns, match);
-                }
-            }
-            if (nmatches.size() > 0) {
-                matches = nmatches;
-            }
-        }
-        // Start reordering with assignment
-        if (matches.size() != 1 && reorderArguments && args.size() > 1) {
-            Map<Constructor, List<Object>> nmatches = new HashMap<Constructor, List<Object>>();
-            for (Constructor cns : constructors) {
-                ArgumentMatcher matcher = new ArgumentMatcher(cns.getGenericParameterTypes(), false);
-                List<Object> match = matcher.match(args, types);
-                if (match != null) {
-                    nmatches.put(cns, match);
-                }
-            }
-            if (nmatches.size() > 0) {
-                matches = nmatches;
-            }
-        }
-        // Start reordering with conversion
-        if (matches.size() != 1 && reorderArguments && args.size() > 1) {
-            Map<Constructor, List<Object>> nmatches = new HashMap<Constructor, List<Object>>();
-            for (Constructor cns : constructors) {
-                ArgumentMatcher matcher = new ArgumentMatcher(cns.getGenericParameterTypes(), true);
-                List<Object> match = matcher.match(args, types);
-                if (match != null) {
-                    nmatches.put(cns, match);
-                }
-            }
-            if (nmatches.size() > 0) {
-                matches = nmatches;
-            }
-        }
-        return matches;
-    }
-
-    protected Object convert(Object obj, Type type) throws Exception {
-        return blueprintConverter.convert(obj,  new GenericType(type));
-    }
-
-    protected Object convert(Object obj, ReifiedType type) throws Exception {
-        return blueprintConverter.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;
-    }
-}
\ No newline at end of file
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/PrintfAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/PrintfAction.java
deleted file mode 100644
index 5bd4219..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/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.felix.karaf.shell.commands;
-
-import java.util.Collection;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "shell", name = "printf", description = "Format and print arguments")
-public class PrintfAction extends OsgiCommandSupport {
-
-    @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/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/SleepAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/SleepAction.java
deleted file mode 100644
index facadd4..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/SleepAction.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.felix.karaf.shell.commands;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-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 OsgiCommandSupport {
-
-    @Argument(index = 0, name = "duration", description = "The amount of millis to sleep", required = true, multiValued = false)
-    private long time = -1;
-
-    protected Object doExecute() throws Exception {
-        log.info("Sleeping for {}", time);
-
-        try {
-            Thread.sleep(time);
-        }
-        catch (InterruptedException ignore) {
-            log.debug("Sleep was interrupted... :-(");
-        }
-
-        log.info("Awake now");
-        return null;
-    }
-}
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/SortAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/SortAction.java
deleted file mode 100644
index 9f375ba..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/SortAction.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.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.felix.karaf.shell.console.OsgiCommandSupport;
-
-/**
- * Sort lines of text
- *
- * @version $Rev: 722776 $ $Date: 2008-12-03 05:59:59 +0100 (Wed, 03 Dec 2008) $
- */
-@Command(scope = "shell", name = "sort", description = "Write sorted concatenation of all files to standard output.")
-public class SortAction extends OsgiCommandSupport {
-
-    @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/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/SourceAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/SourceAction.java
deleted file mode 100644
index 82b482d..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/SourceAction.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.felix.karaf.shell.commands;
-
-/**
- * TODO
- */
-public class SourceAction {
-}
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/TacAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/TacAction.java
deleted file mode 100644
index 376fcb4..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/TacAction.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.felix.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.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.gogo.commands.Option;
-
-/**
- * Grab the text from the standard input and return it as a string.
- * Also write this text to a file if specified
- *
- * @version $Rev: 593392 $ $Date: 2007-11-09 03:14:15 +0100 (Fri, 09 Nov 2007) $
- */
-@Command(scope = "shell", name = "tac", description = "Captures the STDIN and returns it as a string. Optionally writes the content to a file")
-public class TacAction extends OsgiCommandSupport {
-
-    @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/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/PumpStreamHandler.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/PumpStreamHandler.java
deleted file mode 100644
index ba0d839..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/PumpStreamHandler.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.felix.karaf.shell.commands.utils;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-//
-// Based on Apache Ant 1.6.5
-//
-
-/**
- * Copies standard output and error of children streams to standard output and error of the parent.
- *
- * @version $Rev: 705608 $ $Date: 2008-10-17 15:28:45 +0200 (Fri, 17 Oct 2008) $
- */
-public class PumpStreamHandler
-{
-    private InputStream in;
-
-    private OutputStream out;
-
-    private OutputStream err;
-
-    private Thread outputThread;
-
-    private Thread errorThread;
-
-    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) {
-        assert in != null;
-        assert out != null;
-        assert err != null;
-
-        this.in = in;
-        this.out = out;
-        this.err = err;
-    }
-
-    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 (outputThread != null) {
-            outputThread.start();
-        }
-
-        if (errorThread != null) {
-            errorThread.start();
-        }
-
-        if (inputPump != null) {
-            Thread inputThread = new Thread(inputPump);
-            inputThread.setDaemon(true);
-            inputThread.start();
-        }
-    }
-
-    /**
-     * Stop pumping the streams.
-     */
-    public void stop() {
-        if (outputThread != null) {
-            try {
-                outputThread.join();
-            }
-            catch (InterruptedException e) {
-                // ignore
-            }
-        }
-
-        if (errorThread != null) {
-            try {
-                errorThread.join();
-            }
-            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;
-
-        outputThread = 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;
-
-        errorThread = createPump(in, out);
-    }
-
-    /**
-     * Creates a stream pumper to copy the given input stream to the given output stream.
-     */
-    protected Thread 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 Thread createPump(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
-        assert in != null;
-        assert out != null;
-
-        final Thread result = new Thread(new StreamPumper(in, out, closeWhenExhausted));
-        result.setDaemon(true);
-        return result;
-    }
-
-    /**
-     * 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;
-    }
-}
\ No newline at end of file
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java
deleted file mode 100644
index 9d15286..0000000
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.commands.utils;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-//
-// Based on Apache Ant 1.6.5
-//
-
-/**
- * Copies all data from an input stream to an output stream.
- *
- * @version $Rev: 705608 $ $Date: 2008-10-17 15:28:45 +0200 (Fri, 17 Oct 2008) $
- */
-public class StreamPumper
-    implements Runnable
-{
-    private InputStream in;
-
-    private OutputStream out;
-
-    private volatile boolean finish;
-
-    private volatile boolean finished;
-
-    private boolean closeWhenExhausted;
-
-    private boolean autoflush;
-
-    private Exception exception;
-
-    private int bufferSize = 128;
-
-    private boolean started;
-
-    /**
-     * Create a new stream pumper.
-     *
-     * @param in                    Input stream to read data from
-     * @param out                   Output stream to write data to.
-     * @param closeWhenExhausted    If true, the output stream will be closed when
-     *                              the input is exhausted.
-     */
-    public StreamPumper(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
-        assert in != null;
-        assert out != null;
-
-        this.in = in;
-        this.out = out;
-        this.closeWhenExhausted = closeWhenExhausted;
-    }
-
-    /**
-     * Create a new stream pumper.
-     *
-     * @param in    Input stream to read data from
-     * @param out   Output stream to write data to.
-     */
-    public StreamPumper(final InputStream in, final OutputStream out) {
-        this(in, out, false);
-    }
-
-    /**
-     * Set whether data should be flushed through to the output stream.
-     *
-     * @param autoflush     If true, push through data; if false, let it be buffered
-     */
-    public void setAutoflush(boolean autoflush) {
-        this.autoflush = autoflush;
-    }
-
-    /**
-     * Copies data from the input stream to the output stream.
-     *
-     * Terminates as soon as the input stream is closed or an error occurs.
-     */
-    public void run() {
-        synchronized (this) {
-            started = true;
-        }
-        finished = false;
-        finish = false;
-
-        final byte[] buf = new byte[bufferSize];
-
-        int length;
-        try {
-            do {
-                while (in.available() > 0 && !finish) {
-                    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 && closeWhenExhausted);
-        }
-        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();
-    }
-}
\ No newline at end of file
diff --git a/karaf/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml b/karaf/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
deleted file mode 100644
index ec7e7c1..0000000
--- a/karaf/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
+++ /dev/null
@@ -1,85 +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://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="shell/cat">
-            <action class="org.apache.felix.karaf.shell.commands.CatAction"/>
-        </command>
-        <command name="shell/each">
-            <action class="org.apache.felix.karaf.shell.commands.EachAction"/>
-        </command>
-        <command name="shell/echo">
-            <action class="org.apache.felix.karaf.shell.commands.EchoAction"/>
-        </command>
-        <command name="shell/exec">
-            <action class="org.apache.felix.karaf.shell.commands.ExecuteAction"/>
-        </command>
-        <command name="shell/grep">
-            <action class="org.apache.felix.karaf.shell.commands.GrepAction"/>
-        </command>
-        <command name="shell/history">
-            <action class="org.apache.felix.karaf.shell.commands.HistoryAction"/>
-        </command>
-        <command name="shell/if">
-            <action class="org.apache.felix.karaf.shell.commands.IfAction"/>
-        </command>
-        <command name="shell/info">
-            <action class="org.apache.felix.karaf.shell.commands.InfoAction"/>
-        </command>
-        <command name="shell/clear">
-            <action class="org.apache.felix.karaf.shell.commands.ClearAction"/>
-        </command>
-        <command name="shell/java">
-            <action class="org.apache.felix.karaf.shell.commands.JavaAction"/>
-        </command>
-        <!--
-        <command name="shell/more">
-            <action class="org.apache.felix.karaf.shell.commands.MoreAction"/>
-        </command>
-        -->
-        <command name="shell/new">
-            <action class="org.apache.felix.karaf.shell.commands.NewAction">
-                <property name="blueprintConverter" ref="blueprintConverter"/>
-            </action>
-        </command>
-        <command name="shell/logout">
-            <action class="org.apache.felix.karaf.shell.commands.LogoutAction"/>
-        </command>
-        <command name="shell/printf">
-            <action class="org.apache.felix.karaf.shell.commands.PrintfAction"/>
-        </command>
-        <command name="shell/sleep">
-            <action class="org.apache.felix.karaf.shell.commands.SleepAction"/>
-        </command>
-        <command name="shell/sort">
-            <action class="org.apache.felix.karaf.shell.commands.SortAction"/>
-        </command>
-        <!--
-        <command name="shell/source">
-            <action class="org.apache.felix.karaf.shell.commands.SourceAction"/>
-        </command>
-        -->
-        <command name="shell/tac">
-            <action class="org.apache.felix.karaf.shell.commands.TacAction"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/karaf/shell/commands/src/test/java/org/apache/felix/karaf/shell/commands/GrepTest.java b/karaf/shell/commands/src/test/java/org/apache/felix/karaf/shell/commands/GrepTest.java
deleted file mode 100644
index 0469d64..0000000
--- a/karaf/shell/commands/src/test/java/org/apache/felix/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.felix.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/shell/commands/src/test/java/org/apache/felix/karaf/shell/commands/SortTest.java b/karaf/shell/commands/src/test/java/org/apache/felix/karaf/shell/commands/SortTest.java
deleted file mode 100644
index 8e9d72f..0000000
--- a/karaf/shell/commands/src/test/java/org/apache/felix/karaf/shell/commands/SortTest.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.felix.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));
-    }
-
-}
diff --git a/karaf/shell/config/NOTICE b/karaf/shell/config/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/shell/config/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/shell/config/pom.xml b/karaf/shell/config/pom.xml
deleted file mode 100644
index ec086e6..0000000
--- a/karaf/shell/config/pom.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>org.apache.felix.karaf.shell.config</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Shell ConfigAdmin Commands</name>
-
-    <description>
-        Provides the ConfigAdmin Shell commands
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-jdk14</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <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>
-                            !${project.artifactId}*,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>!*</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/CancelCommand.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/CancelCommand.java
deleted file mode 100644
index 15e31ca..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/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.felix.karaf.shell.config;
-
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "config", name = "cancel", description = "Cancel 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/shell/config/src/main/java/org/apache/felix/karaf/shell/config/ConfigCommandSupport.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/ConfigCommandSupport.java
deleted file mode 100644
index 9d945b7..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/ConfigCommandSupport.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.karaf.shell.config;
-
-import java.util.Dictionary;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.osgi.framework.ServiceReference;
-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";
-
-    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;
-        }
-        try {
-            ConfigurationAdmin admin = (ConfigurationAdmin) getBundleContext().getService(ref);
-            if (admin == null) {
-                System.out.println("ConfigAdmin service is unavailable.");
-                return null;
-            }
-
-            doExecute(admin);
-        }
-        finally {
-            getBundleContext().ungetService(ref);
-        }
-        return null;
-    }
-
-    protected Dictionary getEditedProps() throws Exception {
-        return (Dictionary) this.session.get(PROPERTY_CONFIG_PROPS);
-    }
-
-    protected abstract void doExecute(ConfigurationAdmin admin) throws Exception;
-
-}
diff --git a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/EditCommand.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/EditCommand.java
deleted file mode 100644
index ea807f4..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/EditCommand.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.felix.karaf.shell.config;
-
-import java.util.Dictionary;
-import java.util.Properties;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.gogo.commands.Command;
-import org.osgi.service.cm.ConfigurationAdmin;
-
-@Command(scope = "config", name = "edit", description = "Create or edit a configuration.")
-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;
-
-    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 = admin.getConfiguration(pid).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/shell/config/src/main/java/org/apache/felix/karaf/shell/config/ListCommand.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/ListCommand.java
deleted file mode 100644
index b0a0eb5..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/ListCommand.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.felix.karaf.shell.config;
-
-import java.util.Dictionary;
-import java.util.Enumeration;
-
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "config", name = "list", description = "Lists existing configurations.")
-public class ListCommand extends ConfigCommandSupport {
-
-    @Argument(index = 0, name = "query", description = "Specify a LDAP query", required = false, multiValued = false)
-    String query;
-
-    protected void doExecute(ConfigurationAdmin admin) throws Exception {
-        Configuration[] configs = admin.listConfigurations(query);
-        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/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropAppendCommand.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropAppendCommand.java
deleted file mode 100644
index a6a441d..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropAppendCommand.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.felix.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;
-
-/**
- * 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 ConfigCommandSupport {
-
-    @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
-	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");
-        } else {
-        	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/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropDelCommand.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropDelCommand.java
deleted file mode 100644
index d6959eb..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropDelCommand.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.felix.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 = "propdel", description = "Deletes a property from the edited configuration.")
-public class PropDelCommand extends ConfigCommandSupport {
-
-    @Argument(index = 0, name = "property", description = "The name of the property to delete", required = true, multiValued = false)
-    String prop;
-
-    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");
-        } else {
-            props.remove(prop);
-        }
-    }
-
-}
diff --git a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropListCommand.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropListCommand.java
deleted file mode 100644
index 905b664..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropListCommand.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.felix.karaf.shell.config;
-
-import java.util.Dictionary;
-import java.util.Enumeration;
-
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "config", name = "proplist", description = "Lists properties from the currently edited configuration.")
-public class PropListCommand extends ConfigCommandSupport {
-
-    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");
-        } else {
-            for (Enumeration e = props.keys(); e.hasMoreElements();) {
-                Object key = e.nextElement();
-                System.out.println("   " + key + " = " + props.get(key));
-            }
-        }
-    }
-
-}
diff --git a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropSetCommand.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropSetCommand.java
deleted file mode 100644
index d8a12ea..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/PropSetCommand.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.felix.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 ConfigCommandSupport {
-
-    @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;
-
-    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");
-        } else {
-            props.put(prop, value);
-        }
-    }
-
-}
diff --git a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/UpdateCommand.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/UpdateCommand.java
deleted file mode 100644
index 9da60a2..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/UpdateCommand.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.felix.karaf.shell.config;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.Properties;
-
-import org.apache.felix.gogo.commands.Option;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "config", name = "update", description = "Save and propagate 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")
-    private boolean bypassStorage;
-
-    private File storage;
-
-    public File getStorage() {
-        return storage;
-    }
-
-    public void setStorage(File storage) {
-        this.storage = storage;
-    }
-
-    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");
-        } else if (!bypassStorage && storage != null) {
-            Properties p = new Properties();
-            for (Enumeration keys = props.keys(); keys.hasMoreElements();) {
-                Object key = keys.nextElement();
-                if (!"service.pid".equals(key) && !"felix.fileinstall.filename".equals(key)) {
-                    p.put(key, props.get(key));
-                }
-            }
-            storage.mkdirs();
-            String pid = (String) this.session.get(PROPERTY_CONFIG_PID);
-            FileOutputStream os = new FileOutputStream(new File(storage, pid + ".cfg"));
-            try {
-                p.store(os, null);
-            } finally {
-                os.close();
-            }
-            this.session.put(PROPERTY_CONFIG_PID, null);
-            this.session.put(PROPERTY_CONFIG_PROPS, null);
-        } else {
-            String pid = (String) this.session.get(PROPERTY_CONFIG_PID);
-            Configuration cfg = admin.getConfiguration(pid, null);
-            cfg.update(props);
-            this.session.put(PROPERTY_CONFIG_PID, null);
-            this.session.put(PROPERTY_CONFIG_PROPS, null);
-        }
-    }
-}
diff --git a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/completers/ConfigurationCompleter.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/completers/ConfigurationCompleter.java
deleted file mode 100644
index c366f1e..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/completers/ConfigurationCompleter.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.karaf.shell.config.completers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.felix.karaf.shell.console.completer.StringsCompleter;
-import org.apache.felix.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) {
-            if (config.getFactoryPid() != null) {
-                pids.add(config.getFactoryPid());
-            } else {
-                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.getFactoryPid()!=null ? configurationEvent.getFactoryPid() : 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/shell/config/src/main/java/org/apache/felix/karaf/shell/config/completers/ConfigurationPropertyCompleter.java b/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/completers/ConfigurationPropertyCompleter.java
deleted file mode 100644
index d74b524..0000000
--- a/karaf/shell/config/src/main/java/org/apache/felix/karaf/shell/config/completers/ConfigurationPropertyCompleter.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.felix.karaf.shell.config.completers;
-
-import java.util.List;
-
-import org.apache.felix.karaf.shell.console.Completer;
-
-/**
- * {@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 {
-
-    public int complete(final String buffer, final int cursor, final List candidates) {
-        // TODO: currently we have no way to access the session which is being run in this thread
-        return -1;
-
-//        if (vars.get(ConfigCommandSupport.PROPERTY_CONFIG_PID) == null) {
-//            return -1;
-//        }
-//
-//        Dictionary props = (Dictionary) vars.get(ConfigCommandSupport.PROPERTY_CONFIG_PROPS);
-//        StringsCompleter delegate = new StringsCompleter();
-//
-//        for (Enumeration e = props.keys(); e.hasMoreElements();) {
-//            String key = (String) e.nextElement();
-//            delegate.getStrings().add(key);
-//        }
-//
-//        return delegate.complete(buffer, cursor, candidates);
-    }
-}
diff --git a/karaf/shell/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/karaf/shell/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 342fcc1..0000000
--- a/karaf/shell/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,87 +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://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="config/cancel">
-            <action class="org.apache.felix.karaf.shell.config.CancelCommand"/>
-        </command>
-        <command name="config/edit">
-            <action class="org.apache.felix.karaf.shell.config.EditCommand"/>
-            <completers>
-                <ref component-id="configCompleter" />
-                <null/>
-            </completers>
-        </command>
-        <command name="config/list">
-            <action class="org.apache.felix.karaf.shell.config.ListCommand"/>
-        </command>
-        <command name="config/propdel">
-            <action class="org.apache.felix.karaf.shell.config.PropDelCommand"/>
-            <completers>
-                <ref component-id="configPropertyCompleter" />
-                <null/>
-            </completers>
-        </command>
-        <command name="config/proplist">
-            <action class="org.apache.felix.karaf.shell.config.PropListCommand"/>
-        </command>
-        <command name="config/propset">
-            <action class="org.apache.felix.karaf.shell.config.PropSetCommand"/>
-            <completers>
-                <ref component-id="configPropertyCompleter" />
-                <null/>
-            </completers>
-        </command>
-        <command name="config/propappend">
-            <action class="org.apache.felix.karaf.shell.config.PropAppendCommand"/>
-            <completers>
-                <ref component-id="configPropertyCompleter" />
-                <null/>
-            </completers>
-        </command>
-        <command name="config/update">
-            <action class="org.apache.felix.karaf.shell.config.UpdateCommand">
-                <property name="storage" value="${storage}" />
-            </action>
-        </command>
-    </command-bundle>
-
-    <bean id="configCompleter" class="org.apache.felix.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.felix.karaf.shell.config.completers.ConfigurationPropertyCompleter" />
-
-    <reference id="configAdmin" interface="org.osgi.service.cm.ConfigurationAdmin"  />
-
-    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]" />
-
-    <cm:property-placeholder persistent-id="org.apache.felix.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/shell/config/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf/shell/config/src/main/resources/OSGI-INF/metatype/metatype.properties
deleted file mode 100644
index 206b662..0000000
--- a/karaf/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 Felix Karaf Shell Config
-config.description = Configuration of Apache Felix Karaf Shell Config
-
-storage.name = Storage directory
-storage.description = the directory used as a storage for configurations
diff --git a/karaf/shell/config/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf/shell/config/src/main/resources/OSGI-INF/metatype/metatype.xml
deleted file mode 100644
index 8fe7363..0000000
--- a/karaf/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.felix.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.felix.karaf.shell.config">
-        <Object ocdref="org.apache.felix.karaf.shell.config"/>
-    </Designate>
-</metatype:MetaData>
diff --git a/karaf/shell/config/src/test/java/org/apache/felix/karaf/shell/config/EditCommandTest.java b/karaf/shell/config/src/test/java/org/apache/felix/karaf/shell/config/EditCommandTest.java
deleted file mode 100644
index f4787c1..0000000
--- a/karaf/shell/config/src/test/java/org/apache/felix/karaf/shell/config/EditCommandTest.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.felix.karaf.shell.config;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-
-import java.io.InputStream;
-import java.io.PrintStream;
-import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import junit.framework.TestCase;
-
-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 org.osgi.service.command.CommandSession;
-
-/**
- * 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);
-        
-        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)).andReturn(config);
-        replay(admin);
-        
-        // the ConfigAdmin service returns a Dictionary for an existing PID
-        Properties props = new Properties();
-        expect(config.getProperties()).andReturn(props);
-        replay(config);
-        
-        command.pid = PID; 
-        command.execute(session);
-        
-        // the PID and Dictionary should have been set on the session
-        assertEquals("The PID should be set on the session",
-                     PID, session.get(ConfigCommandSupport.PROPERTY_CONFIG_PID));
-        assertSame("The Dictionary returned by the ConfigAdmin service should be set on the session",
-                   props, session.get(ConfigCommandSupport.PROPERTY_CONFIG_PROPS));
-    }
-    
-    @SuppressWarnings("unchecked")
-    public void testExecuteOnNewPid() throws Exception {        
-        Configuration config = createMock(Configuration.class);
-        expect(admin.getConfiguration(PID)).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());
-    }
-    
-    /*
-     * A mock CommandSession implementation that only cares about the properties set on the session
-     */
-    private 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/shell/console/NOTICE b/karaf/shell/console/NOTICE
deleted file mode 100644
index e6bc1e8..0000000
--- a/karaf/shell/console/NOTICE
+++ /dev/null
@@ -1,29 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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 developed at
-FUSE Source (http://www.fusesource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-JLine (http://jline.sourceforge.net).
-Licensed under the BSD License.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/shell/console/pom.xml b/karaf/shell/console/pom.xml
deleted file mode 100644
index 60bb571..0000000
--- a/karaf/shell/console/pom.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Shell Console</name>
-
-    <description>
-        Provides the OSGi Shell integration
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>jline</groupId>
-            <artifactId>jline</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.fusesource.jansi</groupId>
-            <artifactId>jansi</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix.gogo</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <resources>
-            <resource>
-                <directory>${project.basedir}/src/main/resources</directory>
-                <includes>
-                    <include>**/*</include>
-                </includes>
-            </resource>
-            <resource>
-                <directory>${project.basedir}/src/main/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>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Import-Package>
-                            !org.apache.felix.karaf.shell.console*,
-                            !org.apache.felix.gogo.commands*,
-                            !org.fusesource.jansi*,
-                            !javax.swing,
-                            !jline,
-                            com.sun.jna*;resolution:=optional,
-                            org.apache.felix.karaf.branding;resolution:=optional,
-                            *
-                        </Import-Package>
-                        <Export-Package>
-                            org.apache.felix.gogo.commands*;version=${felix.gogo.version},
-                            org.apache.felix.karaf.shell.console*;version=${project.version},
-                            org.fusesource.jansi;version=${jansi.version},
-                            jline;version=${jline.version}
-                        </Export-Package>
-                        <Private-Package>
-                            org.fusesource.jansi.internal
-                        </Private-Package>
-                        <Bundle-NativeCode>jline/jline32.dll;
-                                           osname=Win32;
-                                           processor=x86,
-                                           jline/jline64.dll;
-                                           osname=Win32;
-                                           processor=x86-64,
-                                           *
-                        </Bundle-NativeCode>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/shell/console/src/main/filtered-resources/org/apache/felix/karaf/shell/console/branding.properties b/karaf/shell/console/src/main/filtered-resources/org/apache/felix/karaf/shell/console/branding.properties
deleted file mode 100644
index 5b62a4f..0000000
--- a/karaf/shell/console/src/main/filtered-resources/org/apache/felix/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 Felix Karaf\u001B[0m (${project.version})\r\n\
-\r\n\
-Hit '\u001B[1m<tab>\u001B[0m' for a list of available commands\r\n\
-   and '\u001B[1m[cmd] --help\u001B[0m' for help on a specific command.\r\n\
-Hit '\u001B[1m<ctrl-d>\u001B[0m' or '\u001B[1mosgi:shutdown\u001B[0m' to shutdown Karaf.\r\n
-
-
diff --git a/karaf/shell/console/src/main/java/jline/AnsiWindowsTerminal.java b/karaf/shell/console/src/main/java/jline/AnsiWindowsTerminal.java
deleted file mode 100644
index 077ee72..0000000
--- a/karaf/shell/console/src/main/java/jline/AnsiWindowsTerminal.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 jline;
-
-import org.fusesource.jansi.AnsiConsole;
-import org.fusesource.jansi.WindowsAnsiOutputStream;
-
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-public class AnsiWindowsTerminal extends WindowsTerminal {
-
-    private boolean ansisupported = checkAnsiSupport();
-
-    @Override
-    public boolean isANSISupported() {
-        return ansisupported;
-    }
-
-    @Override
-    public int readCharacter(InputStream in) throws IOException {
-        return in.read();
-    }
-
-    public int readDirectChar(InputStream in) throws IOException {
-        return super.readCharacter(in);
-    }
-
-    public static boolean checkAnsiSupport() {
-        OutputStream dummy = new ByteArrayOutputStream();
-        OutputStream ansiout = AnsiConsole.wrapOutputStream(dummy);
-        try {
-            dummy.close();
-            ansiout.close();
-        } catch (IOException ignore) {
-        }
-
-        return (ansiout instanceof WindowsAnsiOutputStream);
-
-    }
-
-}
diff --git a/karaf/shell/console/src/main/java/jline/NoInterruptUnixTerminal.java b/karaf/shell/console/src/main/java/jline/NoInterruptUnixTerminal.java
deleted file mode 100644
index 9093a40..0000000
--- a/karaf/shell/console/src/main/java/jline/NoInterruptUnixTerminal.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 jline;
-
-import java.io.IOException;
-
-public class NoInterruptUnixTerminal extends UnixTerminal {
-
-    @Override
-    public void initializeTerminal() throws IOException, InterruptedException {
-        super.initializeTerminal();
-        stty("intr undef");
-    }
-
-    @Override
-    public void restoreTerminal() throws Exception {
-        stty("intr ^C");
-        super.restoreTerminal();
-    }
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Action.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Action.java
deleted file mode 100644
index 7979a41..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Action.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.felix.gogo.commands;
-
-import org.osgi.service.command.CommandSession;
-
-public interface Action
-{
-
-    Object execute(CommandSession session) throws Exception;
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Argument.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Argument.java
deleted file mode 100644
index e1b8f7f..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Argument.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.felix.gogo.commands;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD})
-public @interface Argument
-{
-    String name() default "VAL";
-
-    String description() default "";
-
-    boolean required() default false;
-
-    int index() default 0;
-
-    boolean multiValued() default false;
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Command.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Command.java
deleted file mode 100644
index 9f94e1f..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Command.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.felix.gogo.commands;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.TYPE})
-public @interface Command
-{
-    String scope();
-
-    String name();
-
-    String description() default "";
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Option.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Option.java
deleted file mode 100644
index 0197ff5..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/Option.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.felix.gogo.commands;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD})
-public @interface Option
-{
-    String name();
-
-    String[] aliases() default {};
-
-    String description() default "";
-
-    boolean required() default false;
-
-    boolean multiValued() default false;
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/AbstractCommand.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/AbstractCommand.java
deleted file mode 100644
index 1cf3a72..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/AbstractCommand.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.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.osgi.service.command.CommandSession;
-import org.osgi.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);
-        }
-    }
-
-    protected abstract Action createNewAction() throws Exception;
-
-    /**
-     * 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
-     */
-    protected void releaseAction(Action action) throws Exception {
-    	// Do nothing by default (stateful)
-    }
-
-    protected ActionPreparator getPreparator() throws Exception {
-        return new DefaultActionPreparator();
-    }
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/ActionPreparator.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/ActionPreparator.java
deleted file mode 100644
index ef289e8..0000000
--- a/karaf/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.osgi.service.command.CommandSession;
-import org.apache.felix.gogo.commands.Action;
-
-public interface ActionPreparator {
-
-    boolean prepare(Action action, CommandSession session, List<Object> arguments) throws Exception;
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/DefaultActionPreparator.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/DefaultActionPreparator.java
deleted file mode 100644
index b124691..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/DefaultActionPreparator.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.lang.reflect.Type;
-import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Arrays;
-import java.util.Set;
-import java.util.HashSet;
-import java.io.PrintStream;
-
-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.basic.ActionPreparator;
-import org.apache.felix.gogo.commands.converter.DefaultConverter;
-import org.osgi.service.command.CommandSession;
-
-public class DefaultActionPreparator implements ActionPreparator {
-
-    protected 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 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) {
-                    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.getClass().getAnnotation(Command.class), options.keySet(), arguments.keySet(), 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.binarySearch(opt.aliases(), name) >= 0) {
-                        option = opt;
-                        break;
-                    }
-                }
-                if (option == null) {
-                    throw new IllegalArgumentException("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) {
-                    throw new IllegalArgumentException("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()) {
-                    throw new IllegalArgumentException("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) {
-                throw new IllegalArgumentException("Option " + option.name() + " is required");
-            }
-        }
-        for (Argument argument : arguments.keySet()) {
-            if (argument.required() && argumentValues.get(argument) == null) {
-                throw new IllegalArgumentException("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 = convert(action, session, entry.getValue(), field.getGenericType());
-            field.setAccessible(true);
-            field.set(action, value);
-        }
-        for (Map.Entry<Argument, Object> entry : argumentValues.entrySet()) {
-            Field field = arguments.get(entry.getKey());
-            Object value = convert(action, session, entry.getValue(), field.getGenericType());
-            field.setAccessible(true);
-            field.set(action, value);
-        }
-        return true;
-    }
-
-    protected void printUsage(CommandSession session, Command command, Set<Option> options, Set<Argument> arguments, PrintStream out)
-    {
-        options = new HashSet<Option>(options);
-        options.add(HELP);
-        if (command != null && command.description() != null && command.description().length() > 0)
-        {
-            out.println(command.description());
-            out.println();
-        }
-        String syntax = "syntax: ";
-        if (command != null)
-        {
-            syntax += command.scope() + ":" + command.name();
-        }
-        if (options.size() > 0)
-        {
-            syntax += " [options]";
-        }
-        if (arguments.size() > 0)
-        {
-            syntax += " [arguments]";
-        }
-        out.println(syntax);
-        out.println();
-        if (arguments.size() > 0)
-        {
-            out.println("arguments:");
-            for (Argument argument : arguments)
-            {
-                out.print("  ");
-                out.print(argument.name());
-                out.print("  ");
-                out.print(argument.description());
-                out.println();
-            }
-            out.println();
-        }
-        if (options.size() > 0)
-        {
-            out.println("options:");
-            for (Option option : options)
-            {
-                out.print("  ");
-                out.print(option.name());
-                out.print("  ");
-                if (option.aliases().length > 0)
-                {
-                    out.print("(");
-                    out.print(Arrays.toString(option.aliases()));
-                    out.print(")  ");
-                }
-                out.print(option.description());
-                out.println();
-            }
-            out.println();
-        }
-    }
-
-    protected Object convert(Action action, CommandSession session, Object value, Type toType) throws Exception
-    {
-        return new DefaultConverter(action.getClass().getClassLoader()).convert(value, toType);
-    }
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java
deleted file mode 100644
index 175281e..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.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.felix.gogo.commands.basic;
-
-import java.util.Hashtable;
-
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.command.Function;
-import org.apache.felix.gogo.commands.basic.AbstractCommand;
-import org.apache.felix.gogo.commands.Action;
-import org.apache.felix.gogo.commands.Command;
-
-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;
-    }
-
-    protected Action createNewAction() throws Exception {
-        return actionClass.newInstance();
-    }
-
-
-    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/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/DefaultConverter.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/DefaultConverter.java
deleted file mode 100644
index df20321..0000000
--- a/karaf/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/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/GenericType.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/GenericType.java
deleted file mode 100644
index 43f5f91..0000000
--- a/karaf/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/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/ReifiedType.java b/karaf/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/ReifiedType.java
deleted file mode 100644
index 239616e..0000000
--- a/karaf/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/shell/console/src/main/java/org/apache/felix/karaf/shell/console/BlueprintContainerAware.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/BlueprintContainerAware.java
deleted file mode 100644
index 11b1b68..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/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.felix.karaf.shell.console;
-
-import org.osgi.service.blueprint.container.BlueprintContainer;
-
-public interface BlueprintContainerAware {
-
-    void setBlueprintContainer(BlueprintContainer blueprintContainer);
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/BundleContextAware.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/BundleContextAware.java
deleted file mode 100644
index c5fbe40..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/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.felix.karaf.shell.console;
-
-import org.osgi.framework.BundleContext;
-
-public interface BundleContextAware {
-
-    void setBundleContext(BundleContext bundleContext);
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/CloseShellException.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/CloseShellException.java
deleted file mode 100644
index 2753112..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/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.felix.karaf.shell.console;
-
-/**
- * Exception thrown to indicate the console to close.
- */
-public class CloseShellException extends Exception {
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/CompletableFunction.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/CompletableFunction.java
deleted file mode 100644
index 486474b..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/CompletableFunction.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.felix.karaf.shell.console;
-
-import java.util.List;
-
-import org.osgi.service.command.Function;
-
-public interface CompletableFunction extends Function {
-
-    List<Completer> getCompleters();
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/Completer.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/Completer.java
deleted file mode 100644
index b72ba4b..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/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.felix.karaf.shell.console;
-
-import java.util.List;
-
-public interface Completer {
-
-    int complete(String buffer, int cursor, List<String> candidates);
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/OsgiCommandSupport.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/OsgiCommandSupport.java
deleted file mode 100644
index a992893..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/OsgiCommandSupport.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.felix.karaf.shell.console;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.gogo.commands.Action;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.command.CommandSession;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class OsgiCommandSupport implements Action, BundleContextAware {
-
-    protected final Logger log = LoggerFactory.getLogger(getClass());
-    protected BundleContext bundleContext;
-    protected CommandSession session;
-    protected List<ServiceReference> usedReferences;
-
-    public Object execute(CommandSession session) throws Exception {
-        this.session = session;
-        try {
-            return doExecute();
-        } finally {
-            ungetServices();
-        }
-    }
-
-    protected abstract Object doExecute() throws Exception;
-
-    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/shell/console/src/main/java/org/apache/felix/karaf/shell/console/commands/BlueprintCommand.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/commands/BlueprintCommand.java
deleted file mode 100644
index dcb3eb4..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/commands/BlueprintCommand.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.console.commands;
-
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Arrays;
-import java.io.PrintStream;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import jline.Terminal;
-import org.apache.felix.gogo.commands.Action;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.gogo.commands.Argument;
-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.karaf.shell.console.BlueprintContainerAware;
-import org.apache.felix.karaf.shell.console.BundleContextAware;
-import org.apache.felix.karaf.shell.console.CompletableFunction;
-import org.apache.felix.karaf.shell.console.Completer;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.blueprint.container.BlueprintContainer;
-import org.osgi.service.blueprint.container.Converter;
-import org.osgi.service.command.CommandSession;
-import org.fusesource.jansi.Ansi;
-
-public class BlueprintCommand extends AbstractCommand implements CompletableFunction
-{
-
-    protected BlueprintContainer blueprintContainer;
-    protected Converter blueprintConverter;
-    protected String actionId;
-    protected List<Completer> completers;
-
-    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;
-    }
-
-    @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 {
-            return blueprintConverter.convert(o, new GenericType(type));
-        }
-
-        @Override
-        protected void printUsage(CommandSession session, Command command, Set<Option> options, Set<Argument> args, PrintStream out)
-        {
-            Terminal term = (Terminal) session.get(".jline.terminal");
-            List<Argument> arguments = new ArrayList<Argument>(args);
-            Collections.sort(arguments, new Comparator<Argument>() {
-                public int compare(Argument o1, Argument o2) {
-                    return Integer.valueOf(o1.index()).compareTo(Integer.valueOf(o2.index()));
-                }
-            });
-            options = new HashSet<Option>(options);
-            options.add(HELP);
-            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) {
-                    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)
-            {
-                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.getTerminalWidth() : 80, out);
-                }
-                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.getTerminalWidth() : 80, out);
-                }
-                out.println();
-            }
-        }
-
-        protected void printFormatted(String prefix, String str, int termWidth, PrintStream out) {
-            int pfxLen = length(prefix);
-            int maxwidth = termWidth - pfxLen;
-            Pattern wrap = Pattern.compile("(\\S\\S{" + maxwidth + ",}|.{1," + maxwidth + "})(\\s+|$)");
-            Matcher m = wrap.matcher(str);
-            while (m.find()) {
-                out.print(prefix);
-                out.println(m.group());
-            }
-        }
-
-        protected int length(String str) {
-            return str.length();
-        }
-
-    }
-
-    protected Action createNewAction() throws Exception {
-        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/shell/console/src/main/java/org/apache/felix/karaf/shell/console/commands/GenericType.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/commands/GenericType.java
deleted file mode 100644
index c417b86..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/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.felix.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/shell/console/src/main/java/org/apache/felix/karaf/shell/console/commands/NamespaceHandler.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/commands/NamespaceHandler.java
deleted file mode 100644
index 566b586..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/commands/NamespaceHandler.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.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.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.felix.karaf.shell.console.CompletableFunction;
-import org.osgi.service.blueprint.reflect.BeanArgument;
-import org.osgi.service.blueprint.reflect.BeanProperty;
-import org.osgi.service.blueprint.reflect.ComponentMetadata;
-import org.osgi.service.blueprint.reflect.IdRefMetadata;
-import org.osgi.service.blueprint.reflect.Metadata;
-import org.osgi.service.blueprint.reflect.ValueMetadata;
-import org.osgi.service.blueprint.reflect.RefMetadata;
-import org.osgi.service.blueprint.reflect.NullMetadata;
-import org.osgi.service.blueprint.reflect.BeanMetadata;
-import org.osgi.service.blueprint.container.ComponentDefinitionException;
-import org.osgi.service.command.Function;
-
-
-public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHandler {
-
-    public static final String ID = "id";
-    public static final String DESCRIPTION = "description";
-    public static final String PLUGIN_TEMPLATE = "pluginTemplate";
-    public static final String ACTION = "action";
-    public static final String ACTION_ID = "actionId";
-    public static final String COMMAND_TEMPLATE_SUFFIX = "CommandTemplate";
-    public static final String COMMAND_BUNDLE = "command-bundle";
-    public static final String NAME = "name";
-    public static final String LOCATION = "location";
-    public static final String COMMANDS = "commands";
-    public static final String COMMAND = "command";
-    public static final String DOCUMENTER = "documenter";
-    public static final String COMPLETER = "completer";
-    public static final String COMPLETERS = "completers";
-    public static final String BEAN = "bean";
-    public static final String REF = "ref";
-    public static final String NULL = "null";
-    public static final String MESSAGE_SOURCE = "message-source";
-    public static final String MESSAGES = "messages";
-    public static final String PROTOTYPE = "prototype";
-    public static final String ALIAS = "alias";
-    public static final String ALIASES = "aliases";
-    public static final String LINK = "link";
-    public static final String LINKS = "links";
-    public static final String TARGET = "target";
-    public static final String BLUEPRINT_CONTAINER = "blueprintContainer";
-    public static final String BLUEPRINT_CONVERTER = "blueprintConverter";
-
-    private int nameCounter = 0;
-
-    public URL getSchemaLocation(String namespace) {
-        return getClass().getResource("karaf-shell.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);
-        } else if (nodeNameEquals(element, LINK)) {
-//            parseLink(element, context);
-        } else if (nodeNameEquals(element, ALIAS)) {
-//            parseAlias(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));
-//        MutableBeanMetadata documenter = context.createMetadata(MutableBeanMetadata.class);
-//        documenter.setRuntimeClass(MessageSourceCommandDocumenter.class);
-//        command.addProperty(DOCUMENTER, documenter);
-//        MutableBeanMetadata messages = context.createMetadata(MutableBeanMetadata.class);
-//        messages.setRuntimeClass(CommandMessageSource.class);
-//        command.addProperty(MESSAGES, messages);
-//        MutableBeanMetadata location = context.createMetadata(MutableBeanMetadata.class);
-//        location.setRuntimeClass(CommandLocationImpl.class);
-//        location.addArgument(createStringValue(context, element.getAttribute(NAME)), String.class.getName(), 0);
-//        command.addProperty(LOCATION, location);
-
-        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 {
-                    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.addInterface(Function.class.getName());
-        commandService.addInterface(CompletableFunction.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 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 void parseLink(Element element, ParserContext context) {
-//        MutableBeanMetadata link = context.createMetadata(MutableBeanMetadata.class);
-//        link.setRuntimeClass(LinkImpl.class);
-//        link.addArgument(createStringValue(context, element.getAttribute(NAME)), String.class.getName(), 0);
-//        link.addArgument(createStringValue(context, element.getAttribute(TARGET)), String.class.getName(), 0);
-//
-//        MutableServiceMetadata linkService = context.createMetadata(MutableServiceMetadata.class);
-//        linkService.setId(getName());
-//        linkService.addInterface(Link.class.getName());
-//        linkService.setServiceComponent(link);
-//        context.getComponentDefinitionRegistry().registerComponentDefinition(linkService);
-//    }
-//
-//    private void parseAlias(Element element, ParserContext context) {
-//        MutableBeanMetadata alias = context.createMetadata(MutableBeanMetadata.class);
-//        alias.setRuntimeClass(AliasImpl.class);
-//        alias.addArgument(createStringValue(context, element.getAttribute(NAME)), String.class.getName(), 0);
-//        alias.addArgument(createStringValue(context, element.getAttribute(ALIAS)), String.class.getName(), 0);
-//
-//        MutableServiceMetadata aliasService = context.createMetadata(MutableServiceMetadata.class);
-//        aliasService.setId(getName());
-//        aliasService.addInterface(Alias.class.getName());
-//        aliasService.setServiceComponent(alias);
-//        context.getComponentDefinitionRegistry().registerComponentDefinition(aliasService);
-//    }
-//
-    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/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/AggregateCompleter.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/AggregateCompleter.java
deleted file mode 100644
index d858ca2..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/AggregateCompleter.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.felix.karaf.shell.console.completer;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Collection;
-
-import org.apache.felix.karaf.shell.console.Completer;
-
-/**
- * Completer which contains multipule completers and aggregates them together.
- *
- * @version $Rev: 699733 $ $Date: 2008-09-27 22:55:23 +0200 (Sat, 27 Sep 2008) $
- */
-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/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/ArgumentCompleter.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/ArgumentCompleter.java
deleted file mode 100644
index d49ac74..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/ArgumentCompleter.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT 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.felix.karaf.shell.console.completer;
-
-import java.util.*;
-
-import org.apache.felix.karaf.shell.console.Completer;
-
-public class ArgumentCompleter implements Completer {
-    final Completer[] completers;
-    final ArgumentDelimiter delim;
-    boolean strict = true;
-
-    /**
-     *  Constuctor: create a new completor with the default
-     *  argument separator of " ".
-     *
-     *  @param  completer  the embedded completer
-     */
-    public ArgumentCompleter(final Completer completer) {
-        this(new Completer[] {
-                 completer
-             });
-    }
-
-    /**
-     *  Constuctor: create a new completor with the default
-     *  argument separator of " ".
-     *
-     *  @param  completers  the List of completors to use
-     */
-    public ArgumentCompleter(final List<Completer> completers) {
-        this(completers.toArray(new Completer[completers.size()]));
-    }
-
-    /**
-     *  Constuctor: create a new completor with the default
-     *  argument separator of " ".
-     *
-     *  @param  completers  the embedded argument completers
-     */
-    public ArgumentCompleter(final Completer[] completers) {
-        this(completers, new WhitespaceArgumentDelimiter());
-    }
-
-    /**
-     *  Constuctor: create a new completor with the specified
-     *  argument delimiter.
-     *
-     *  @param  completer the embedded completer
-     *  @param  delim     the delimiter for parsing arguments
-     */
-    public ArgumentCompleter(final Completer completer,
-                             final ArgumentDelimiter delim) {
-        this(new Completer[] {
-                 completer
-             }, delim);
-    }
-
-    /**
-     *  Constuctor: create a new completor with the specified
-     *  argument delimiter.
-     *
-     *  @param  completers the embedded completers
-     *  @param  delim      the delimiter for parsing arguments
-     */
-    public ArgumentCompleter(final Completer[] completers,
-                             final ArgumentDelimiter delim) {
-        this.completers = completers;
-        this.delim = delim;
-    }
-
-    /**
-     *  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 = delim.delimit(buffer, cursor);
-        int argpos = list.getArgumentPosition();
-        int argIndex = list.getCursorArgumentIndex();
-
-        if (argIndex < 0) {
-            return -1;
-        }
-
-        final Completer comp;
-
-        // if we are beyond the end of the completors, just use the last one
-        if (argIndex >= completers.length) {
-            comp = completers[completers.length - 1];
-        } else {
-            comp = completers[argIndex];
-        }
-
-        // ensure that all the previous completors are successful before
-        // allowing this completor to pass (only if strict is true).
-        for (int i = 0; getStrict() && (i < argIndex); i++) {
-            Completer sub = completers[(i >= completers.length) ? (completers.length - 1) : i];
-            String[] args = list.getArguments();
-            String arg = ((args == null) || (i >= args.length)) ? "" : args[i];
-
-            List<String> subCandidates = new LinkedList<String>();
-
-            if (sub.complete(arg, arg.length(), subCandidates) == -1) {
-                return -1;
-            }
-
-            if (subCandidates.size() == 0) {
-                return -1;
-            }
-        }
-
-        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 ((cursor != buffer.length()) && delim.isDelimiter(buffer, cursor)) {
-            for (int i = 0; i < candidates.size(); i++) {
-                String val = candidates.get(i);
-
-                while ((val.length() > 0)
-                    && delim.isDelimiter(val, val.length() - 1)) {
-                    val = val.substring(0, val.length() - 1);
-                }
-
-                candidates.set(i, val);
-            }
-        }
-
-        return pos;
-    }
-
-    /**
-     *  The {@link ArgumentCompleter.ArgumentDelimiter} allows custom
-     *  breaking up of a {@link String} into individual arguments in
-     *  order to dispatch the arguments to the nested {@link Completer}.
-     *
-     *  @author  <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
-     */
-    public static interface ArgumentDelimiter {
-        /**
-         *  Break the specified buffer into individual tokens
-         *  that can be completed on their own.
-         *
-         *  @param  buffer           the buffer to split
-         *  @param  argumentPosition the current position of the
-         *                           cursor in the buffer
-         *  @return                  the tokens
-         */
-        ArgumentList delimit(String buffer, int argumentPosition);
-
-        /**
-         *  Returns true if the specified character is a whitespace
-         *  parameter.
-         *
-         *  @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
-         */
-        boolean isDelimiter(String buffer, int pos);
-    }
-
-    /**
-     *  Abstract implementation of a delimiter that uses the
-     *  {@link #isDelimiter} method to determine if a particular
-     *  character should be used as a delimiter.
-     *
-     *  @author  <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
-     */
-    public abstract static class AbstractArgumentDelimiter
-        implements ArgumentDelimiter {
-        private char[] quoteChars = new char[] { '\'', '"' };
-        private char[] escapeChars = new char[] { '\\' };
-
-        public void setQuoteChars(final char[] quoteChars) {
-            this.quoteChars = quoteChars;
-        }
-
-        public char[] getQuoteChars() {
-            return this.quoteChars;
-        }
-
-        public void setEscapeChars(final char[] escapeChars) {
-            this.escapeChars = escapeChars;
-        }
-
-        public char[] getEscapeChars() {
-            return this.escapeChars;
-        }
-
-        public ArgumentList delimit(final String buffer, final int cursor) {
-            List<String> args = new LinkedList<String>();
-            StringBuffer arg = new StringBuffer();
-            int argpos = -1;
-            int bindex = -1;
-
-            for (int i = 0; (buffer != null) && (i <= buffer.length()); i++) {
-                // once we reach the cursor, set the
-                // position of the selected index
-                if (i == cursor) {
-                    bindex = args.size();
-                    // the position in the current argument is just the
-                    // length of the current argument
-                    argpos = arg.length();
-                }
-
-                if ((i == buffer.length()) || isDelimiter(buffer, i)) {
-                    if (arg.length() > 0) {
-                        args.add(arg.toString());
-                        arg.setLength(0); // reset the arg
-                    }
-                } else {
-                    arg.append(buffer.charAt(i));
-                }
-            }
-
-            return new ArgumentList(args.
-                toArray(new String[args.size()]), bindex, argpos, cursor);
-        }
-
-        /**
-         *  Returns true if the specified character is a whitespace
-         *  parameter. Check to ensure that the character is not
-         *  escaped by any of
-         *  {@link #getQuoteChars}, and is not escaped by ant of the
-         *  {@link #getEscapeChars}, 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) {
-            if (isQuoted(buffer, pos)) {
-                return false;
-            }
-
-            if (isEscaped(buffer, pos)) {
-                return false;
-            }
-
-            return isDelimiterChar(buffer, pos);
-        }
-
-        public boolean isQuoted(final String buffer, final int pos) {
-            return false;
-        }
-
-        public boolean isEscaped(final String buffer, final int pos) {
-            if (pos <= 0) {
-                return false;
-            }
-
-            for (int i = 0; (escapeChars != null) && (i < escapeChars.length);
-                     i++) {
-                if (buffer.charAt(pos) == escapeChars[i]) {
-                    return !isEscaped(buffer, pos - 1); // escape escape
-                }
-            }
-
-            return false;
-        }
-
-        /**
-         *  Returns true if the character at the specified position
-         *  if a delimiter. This method will only be called if the
-         *  character is not enclosed in any of the
-         *  {@link #getQuoteChars}, and is not escaped by ant of the
-         *  {@link #getEscapeChars}. To perform escaping manually,
-         *  override {@link #isDelimiter} instead.
-         */
-        public abstract boolean isDelimiterChar(String buffer, int pos);
-    }
-
-    /**
-     *  {@link ArgumentCompleter.ArgumentDelimiter}
-     *  implementation that counts all
-     *  whitespace (as reported by {@link Character#isWhitespace})
-     *  as being a delimiter.
-     *
-     *  @author  <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
-     */
-    public static class WhitespaceArgumentDelimiter
-        extends AbstractArgumentDelimiter {
-        /**
-         *  The character is a delimiter if it is whitespace, and the
-         *  preceeding character is not an escape character.
-         */
-        public boolean isDelimiterChar(String buffer, int pos) {
-            return Character.isWhitespace(buffer.charAt(pos));
-        }
-    }
-
-    /**
-     *  The result of a delimited buffer.
-     *
-     *  @author  <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
-     */
-    public static class ArgumentList {
-        private String[] arguments;
-        private int cursorArgumentIndex;
-        private int argumentPosition;
-        private int bufferPosition;
-
-        /**
-         *  @param  arguments           the array of tokens
-         *  @param  cursorArgumentIndex the token index of the cursor
-         *  @param  argumentPosition    the position of the cursor in the
-         *                              current token
-         *  @param  bufferPosition      the position of the cursor in
-         *                              the whole buffer
-         */
-        public ArgumentList(String[] arguments, int cursorArgumentIndex,
-            int argumentPosition, int bufferPosition) {
-            this.arguments = arguments;
-            this.cursorArgumentIndex = cursorArgumentIndex;
-            this.argumentPosition = argumentPosition;
-            this.bufferPosition = bufferPosition;
-        }
-
-        public void setCursorArgumentIndex(int cursorArgumentIndex) {
-            this.cursorArgumentIndex = cursorArgumentIndex;
-        }
-
-        public int getCursorArgumentIndex() {
-            return this.cursorArgumentIndex;
-        }
-
-        public String getCursorArgument() {
-            if ((cursorArgumentIndex < 0)
-                || (cursorArgumentIndex >= arguments.length)) {
-                return null;
-            }
-
-            return arguments[cursorArgumentIndex];
-        }
-
-        public void setArgumentPosition(int argumentPosition) {
-            this.argumentPosition = argumentPosition;
-        }
-
-        public int getArgumentPosition() {
-            return this.argumentPosition;
-        }
-
-        public void setArguments(String[] arguments) {
-            this.arguments = arguments;
-        }
-
-        public String[] getArguments() {
-            return this.arguments;
-        }
-
-        public void setBufferPosition(int bufferPosition) {
-            this.bufferPosition = bufferPosition;
-        }
-
-        public int getBufferPosition() {
-            return this.bufferPosition;
-        }
-    }
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/CommandsCompleter.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/CommandsCompleter.java
deleted file mode 100644
index e52a23c..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/CommandsCompleter.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.felix.karaf.shell.console.completer;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.felix.karaf.shell.console.Completer;
-import org.apache.felix.karaf.shell.console.CompletableFunction;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.command.CommandProcessor;
-
-public class CommandsCompleter implements Completer {
-
-    private final Map<ServiceReference, Completer> completers = new ConcurrentHashMap<ServiceReference, Completer>();
-
-    private BundleContext bundleContext;
-
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-
-    public void register(ServiceReference reference) {
-        Set<String> functions = getNames(reference);
-        if (functions != null) {
-            List<Completer> cl = new ArrayList<Completer>();
-            cl.add(new StringsCompleter(functions));
-            try {
-                Object function = bundleContext.getService(reference);
-                if (function instanceof CompletableFunction) {
-                    List<Completer> fcl = ((CompletableFunction) function).getCompleters();
-                    if (fcl != null) {
-                        for (Completer c : fcl) {
-                            cl.add(c == null ? NullCompleter.INSTANCE : c);
-                        }
-                    } else {
-                        cl.add(NullCompleter.INSTANCE);
-                    }
-                } else {
-                    cl.add(NullCompleter.INSTANCE);
-                }
-            } finally {
-                bundleContext.ungetService(reference);
-            }
-            ArgumentCompleter c = new ArgumentCompleter(cl);
-            completers.put(reference, c);
-        }
-    }
-
-    public void unregister(ServiceReference reference) {
-        if (reference != null) {
-            completers.remove(reference);
-        }
-    }
-
-    private Set<String> getNames(ServiceReference reference) {
-        Set<String> names = new HashSet<String>();
-        Object scope = reference.getProperty(CommandProcessor.COMMAND_SCOPE);
-        Object function = reference.getProperty(CommandProcessor.COMMAND_FUNCTION);
-        if(scope != null && function != null)
-        {
-            if (function.getClass().isArray())
-            {
-                for (Object f : ((Object[]) function))
-                {
-                    names.add(scope + ":" + f.toString());
-                }
-            }
-            else
-            {
-                names.add(scope + ":" + function.toString());
-            }
-            return names;
-        }
-        return null;
-    }
-
-    public int complete(String buffer, int cursor, List<String> candidates) {
-        int res =  new AggregateCompleter(completers.values()).complete(buffer, cursor, candidates);
-        Collections.sort(candidates);
-        return res;
-    }
-}
-
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/NullCompleter.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/NullCompleter.java
deleted file mode 100644
index c1390bd..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/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.felix.karaf.shell.console.completer;
-
-import java.util.List;
-
-import org.apache.felix.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/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/SessionScopeCompleter.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/SessionScopeCompleter.java
deleted file mode 100644
index dd99f38..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/SessionScopeCompleter.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.console.completer;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import org.apache.felix.karaf.shell.console.Completer;
-import org.osgi.service.command.CommandSession;
-
-/**
- * Completer which uses the session scopes automatically appended in front of buffer.
- *
- * @version $Rev: $ $Date: $
- */
-public class SessionScopeCompleter implements Completer
-{
-
-    private final CommandSession session;
-    private final Completer completer;
-
-    public SessionScopeCompleter( final CommandSession session,
-                                  final Completer completer )
-    {
-        this.session = session;
-        this.completer = completer;
-    }
-
-    public int complete( String buffer, int cursor, List<String> candidates )
-    {
-        // buffer could be null
-        assert candidates != null;
-
-        try
-        {
-            final List<Completion> completions = new ArrayList<Completion>();
-
-            final String scope = (String) session.get( "SCOPE" );
-            if( scope != null )
-            {
-                final String[] segments = scope.split( ":" );
-
-                // Run completer for each segment, saving its completion results
-                int max = -1;
-                for( String segment : segments )
-                {
-                    Completion completion = new Completion( segment, candidates );
-                    completion.complete( completer, buffer, cursor );
-
-                    // Compute the max cursor position
-                    max = Math.max( max, completion.cursor );
-
-                    completions.add( completion );
-                }
-
-                // Append candidates 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;
-            }
-        }
-        catch( Exception ignore )
-        {
-        }
-        return -1;
-    }
-
-    private class Completion
-    {
-
-        public final String scope;
-
-        public final List<String> candidates;
-
-        public int cursor;
-
-        public Completion( final String scope, final List candidates )
-        {
-            assert scope != null;
-            assert candidates != null;
-
-            this.scope = scope;
-            // noinspection unchecked
-            this.candidates = new LinkedList<String>( candidates );
-        }
-
-        public void complete( Completer completer, String buffer, int cursor )
-        {
-            assert completer != null;
-
-            buffer = scope + ":" + buffer;
-            cursor += (scope + ":").length();
-
-            this.cursor = completer.complete( buffer, cursor, candidates );
-
-            cursor -= (scope + ":").length();
-            for (int i = 0; i < candidates.size(); i++) {
-                String s = candidates.get(i);
-                s = s.substring((scope + ":").length());
-                candidates.set(i, s);
-            }
-        }
-
-    }
-
-}
\ No newline at end of file
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/StringsCompleter.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/StringsCompleter.java
deleted file mode 100644
index 6c9629e..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/completer/StringsCompleter.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.felix.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.felix.karaf.shell.console.Completer;
-
-/**
- * Completer for a set of strings.
- *
- * @version $Rev: 722797 $ $Date: 2008-12-03 08:18:16 +0100 (Wed, 03 Dec 2008) $
- */
-public class StringsCompleter
-    implements Completer
-{
-    private final SortedSet<String> strings = new TreeSet<String>();
-
-    public StringsCompleter() {}
-
-    public StringsCompleter(final Collection<String> strings) {
-        assert strings != null;
-
-        getStrings().addAll(strings);
-    }
-
-    public StringsCompleter(final String[] strings) {
-        this(Arrays.asList(strings));
-    }
-
-    public Collection<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 = "";
-        }
-
-        SortedSet<String> matches = strings.tailSet(buffer);
-
-        for (String match : matches) {
-            if (!match.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;
-    }
-}
\ No newline at end of file
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/CompleterAsCompletor.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/CompleterAsCompletor.java
deleted file mode 100644
index 28aca00..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/CompleterAsCompletor.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.karaf.shell.console.jline;
-
-import java.util.List;
-
-import jline.Completor;
-import org.apache.felix.karaf.shell.console.Completer;
-
-public class CompleterAsCompletor implements Completor {
-
-    private final Completer completer;
-
-    public CompleterAsCompletor(Completer completer) {
-        this.completer = completer;
-    }
-
-    public int complete(String buffer, int cursor, List candidates) {
-        return completer.complete(buffer, cursor, candidates);
-    }
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/Console.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/Console.java
deleted file mode 100644
index 029733d..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/Console.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.console.jline;
-
-import java.io.CharArrayWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.InterruptedIOException;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.util.Arrays;
-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.AnsiWindowsTerminal;
-import jline.ConsoleReader;
-import jline.Terminal;
-import jline.UnsupportedTerminal;
-import org.apache.felix.karaf.shell.console.CloseShellException;
-import org.apache.felix.karaf.shell.console.Completer;
-import org.apache.felix.karaf.shell.console.completer.AggregateCompleter;
-import org.apache.felix.karaf.shell.console.completer.SessionScopeCompleter;
-import org.fusesource.jansi.Ansi;
-import org.osgi.service.command.CommandProcessor;
-import org.osgi.service.command.CommandSession;
-import org.osgi.service.command.Converter;
-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";
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(Console.class);
-
-    private CommandSession session;
-    private ConsoleReader reader;
-    private BlockingQueue<Integer> queue;
-    private boolean interrupt;
-    private Thread pipe;
-    private boolean running;
-    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,
-                   Completer completer,
-                   Runnable closeCallback) throws Exception
-    {
-        this.in = in;
-        this.out = out;
-        this.err = err;
-        this.queue = new ArrayBlockingQueue<Integer>(1024);
-        this.terminal = term == null ? new UnsupportedTerminal() : term;
-        this.consoleInput = new ConsoleInputStream();
-        this.session = processor.createSession(this.consoleInput, this.out, this.err);
-        this.session.put("SCOPE", "shell:osgi:*");
-        this.closeCallback = closeCallback;
-
-        reader = new ConsoleReader(this.consoleInput,
-                                   new PrintWriter(this.out),
-                                   getClass().getResourceAsStream("keybinding.properties"),
-                                   this.terminal);
-
-        File file = new File(System.getProperty("user.home"), ".karaf/karaf.history");
-        file.getParentFile().mkdirs();
-        reader.getHistory().setHistoryFile(file);
-        session.put(".jline.history", reader.getHistory());
-        if (completer != null) {
-            reader.addCompletor(
-                new CompleterAsCompletor(
-                    new AggregateCompleter(
-                        Arrays.asList(
-                            completer,
-                            new SessionScopeCompleter( session, completer )
-                        )
-                    )
-                )
-            );
-        }
-        if (Boolean.getBoolean("jline.nobell")) {
-            reader.setBellEnabled(false);
-        }
-        pipe = new Thread(new Pipe());
-        pipe.setName("gogo shell pipe thread");
-        pipe.setDaemon(true);
-    }
-
-    public CommandSession getSession() {
-        return session;
-    }
-
-    public void close() {
-        //System.err.println("Closing");
-        running = false;
-        pipe.interrupt();
-        Thread.interrupted();
-    }
-
-    public void run()
-    {
-        thread = Thread.currentThread();
-        running = true;
-        pipe.start();
-        Properties props = loadBrandingProperties();
-        welcome(props);
-        setSessionProperties(props);
-        String scriptFileName = System.getProperty(SHELL_INIT_SCRIPT);
-        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
-                    }
-                }
-            }
-        }
-        while (running) {
-            try {
-                checkInterrupt();
-                String line = reader.readLine(getPrompt());
-                if (line == null)
-                {
-                    break;
-                }
-                //session.getConsole().println("Executing: " + line);
-                Object result = session.execute(line);
-                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)
-            {
-                try {
-                    LOGGER.info("Exception caught while executing command", t);
-                    session.put(LAST_EXCEPTION, t);
-                    session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
-                    if ( isPrintStackTraces()) {
-                        t.printStackTrace(session.getConsole());
-                    }
-                    else {
-                        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
-                }
-            }
-        }
-        //System.err.println("Exiting console...");
-        if (closeCallback != null)
-        {
-            closeCallback.run();
-        }
-    }
-
-    protected boolean isPrintStackTraces() {
-        Object s = session.get(PRINT_STACK_TRACES);
-        if (s == null) {
-            s = System.getProperty(PRINT_STACK_TRACES);
-        }
-        if (s == null) {
-            return false;
-        }
-        if (s instanceof Boolean) {
-            return (Boolean) s;
-        }
-        return Boolean.parseBoolean(s.toString());
-    }
-
-    protected void welcome(Properties props) {
-        String welcome = props.getProperty("welcome");
-        if (welcome != null && welcome.length() > 0) {
-            session.getConsole().println(welcome);
-        }
-    }
-
-    private void setSessionProperties(Properties props) {
-        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());
-            }
-        }
-    }
-
-    private Properties loadBrandingProperties() {
-        Properties props = new Properties();
-        loadProps(props, "org/apache/felix/karaf/shell/console/branding.properties");
-        loadProps(props, "org/apache/felix/karaf/branding/branding.properties");
-        return props;
-    }
-
-    private void loadProps(Properties props, String resource) {
-        InputStream is = null;
-        try {
-            is = getClass().getClassLoader().getResourceAsStream(resource);
-            if (is != null) {
-                props.load(is);
-            }
-        } catch (IOException e) {
-            // ignore
-        } finally {
-            if (is != null) {
-                try {
-                    is.close();
-                } catch (IOException e) {
-                    // Ignore
-                }
-            }
-        }
-    }
-
-    protected String getPrompt() {
-        try {
-            String prompt;
-            try {
-                Object p = session.get(PROMPT);
-                prompt = p != null ? p.toString() : 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();
-            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;
-        }
-    }
-
-    private class Pipe implements Runnable
-    {
-        public void run()
-        {
-            try {
-                while (running)
-                {
-                    try
-                    {
-                        int c;
-                        if (terminal instanceof AnsiWindowsTerminal) {
-                            c = ((AnsiWindowsTerminal) terminal).readDirectChar(in);
-                        } else {
-                            c = terminal.readCharacter(in);
-                        }
-                        if (c == -1)
-                        {
-                            queue.put(c);
-                            return;
-                        }
-                        else if (c == 4)
-                        {
-                            err.println("^D");
-                        }
-                        else if (c == 3)
-                        {
-                            err.println("^C");
-                            reader.getCursorBuffer().clearBuffer();
-                            interrupt();
-                        }
-                        queue.put(c);
-                    }
-                    catch (Throwable t) {
-                        return;
-                    }
-                }
-            }
-            finally
-            {
-                close();
-            }
-        }
-    }
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/ConsoleFactory.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/ConsoleFactory.java
deleted file mode 100644
index 8dde072..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/ConsoleFactory.java
+++ /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.
- */
-package org.apache.felix.karaf.shell.console.jline;
-
-import java.io.InputStream;
-import java.io.PrintStream;
-import java.io.OutputStream;
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.concurrent.Callable;
-
-import org.apache.felix.karaf.shell.console.Completer;
-import org.apache.felix.karaf.shell.console.completer.AggregateCompleter;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.command.CommandProcessor;
-import org.osgi.service.command.CommandSession;
-import org.fusesource.jansi.AnsiConsole;
-import jline.Terminal;
-
-public class ConsoleFactory {
-
-    private BundleContext bundleContext;
-    private CommandProcessor commandProcessor;
-    private List<Completer> completers;
-    private TerminalFactory terminalFactory;
-    private Console console;
-    private boolean start;
-
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-
-    public synchronized void registerCommandProcessor(CommandProcessor commandProcessor) throws Exception {
-        this.commandProcessor = commandProcessor;
-        start();
-    }
-
-    public synchronized void unregisterCommandProcessor(CommandProcessor commandProcessor) throws Exception {
-        this.commandProcessor = null;
-        stop();
-    }
-
-    public void setCompleters(List<Completer> completers) {
-        this.completers = completers;
-    }
-
-    public void setTerminalFactory(TerminalFactory terminalFactory) {
-        this.terminalFactory = terminalFactory;
-    }
-
-    public void setStart(boolean start) {
-        this.start = start;
-    }
-
-    protected void start() throws Exception {
-        if (start) {
-            InputStream in = unwrap(System.in);
-            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
-                    }
-                }
-            };
-            Terminal terminal = terminalFactory.getTerminal();
-            this.console = new Console(commandProcessor,
-                                       in,
-                                       wrap(out),
-                                       wrap(err),
-                                       terminal,
-                                       new AggregateCompleter(completers),
-                                       callback);
-            CommandSession session = console.getSession();
-            session.put("USER", "karaf");
-            session.put("APPLICATION", System.getProperty("karaf.name", "root"));
-            session.put("LINES", Integer.toString(terminal.getTerminalHeight()));
-            session.put("COLUMNS", Integer.toString(terminal.getTerminalWidth()));
-            session.put(".jline.terminal", terminal);
-            new Thread(console, "Karaf Shell Console Thread").start();
-        }
-    }
-
-    protected void stop() throws Exception {
-        if (console != null) {
-            console.close();
-        }
-    }
-
-    private static PrintStream wrap(PrintStream stream) {
-        OutputStream o = AnsiConsole.wrapOutputStream(stream);
-        if (o instanceof PrintStream) {
-            return ((PrintStream) o);
-        } else {
-            return new PrintStream(o);
-        }
-    }
-
-    private static <T> T unwrap(T stream) {
-        try {
-            Method mth = stream.getClass().getMethod("getRoot");
-            return (T) mth.invoke(stream);
-        } catch (Throwable t) {
-            return stream;
-        }
-    }
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/TerminalFactory.java b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/TerminalFactory.java
deleted file mode 100644
index 585ca4d..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/TerminalFactory.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.felix.karaf.shell.console.jline;
-
-import jline.Terminal;
-import jline.UnsupportedTerminal;
-import jline.AnsiWindowsTerminal;
-import jline.NoInterruptUnixTerminal;
-
-public class TerminalFactory {
-
-    private Terminal term;
-
-    public synchronized Terminal getTerminal() throws Exception {
-        if (term == null) {
-            init();
-        }
-        return term;
-    }
-
-    public void init() throws Exception {
-        if ("jline.UnsupportedTerminal".equals(System.getProperty("jline.terminal"))) {
-            term = new UnsupportedTerminal();
-            return;
-        }
-        
-        boolean windows = System.getProperty("os.name").toLowerCase().contains("windows");
-        try {
-            if (windows) {
-                AnsiWindowsTerminal t = new AnsiWindowsTerminal();
-                t.setDirectConsole(true);
-                t.initializeTerminal();
-                term = t;
-            } else {
-                NoInterruptUnixTerminal t = new NoInterruptUnixTerminal();
-                t.initializeTerminal();
-                term = t;
-            }
-        } catch (Throwable e) {
-            System.out.println("Using an unsupported terminal: " + e.toString());
-            term = new UnsupportedTerminal();
-        }
-    }
-
-    public synchronized void destroy() throws Exception {
-        if (term != null) {
-            term.restoreTerminal();
-            term = null;
-        }
-    }
-
-}
diff --git a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/keybindings.properties b/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/keybindings.properties
deleted file mode 100644
index 93057c2..0000000
--- a/karaf/shell/console/src/main/java/org/apache/felix/karaf/shell/console/jline/keybindings.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.
-##
-
-# Keybinding mapping for JLine. The format is:
-#    [key code]: [logical operation]
-
-# CTRL-B: move to the previous character
-2: PREV_CHAR
-
-# CTRL-G: move to the previous word
-7: PREV_WORD
-
-# CTRL-F: move to the next character
-6: NEXT_CHAR
-
-# CTRL-A: move to the beginning of the line
-1: MOVE_TO_BEG
-
-# CTRL-D: close out the input stream
-4: EXIT
-
-# CTRL-E: move the cursor to the end of the line
-5: MOVE_TO_END
-
-# BACKSPACE, CTRL-H: delete the previous character
-# 8 is the ASCII code for backspace and therefor
-# deleting the previous character
-8: DELETE_PREV_CHAR
-
-# TAB, CTRL-I: signal that console completion should be attempted
-9: COMPLETE
-
-# CTRL-J, CTRL-M: newline
-10: NEWLINE
-
-# CTRL-K: erase the current line
-11: KILL_LINE
-
-# ENTER: newline
-13: NEWLINE
-
-# CTRL-L: clear screen
-12: CLEAR_SCREEN
-
-# CTRL-N: scroll to the next element in the history buffer
-14: NEXT_HISTORY
-
-# CTRL-P: scroll to the previous element in the history buffer
-16: PREV_HISTORY
-
-# CTRL-R: redraw the current line
-18: REDISPLAY
-
-# CTRL-U: delete all the characters before the cursor position
-21: KILL_LINE_PREV
-
-# CTRL-V: paste the contents of the clipboard (useful for Windows terminal)
-22: PASTE
-
-# CTRL-W: delete the word directly before the cursor
-23: DELETE_PREV_WORD
-
-# DELETE, CTRL-?: delete the previous character
-# 127 is the ASCII code for delete
-127: DELETE_PREV_CHAR
diff --git a/karaf/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml b/karaf/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
deleted file mode 100644
index f0a7ee7..0000000
--- a/karaf/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
+++ /dev/null
@@ -1,57 +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="]"/>
-
-    <reference id="commandProcessor" interface="org.osgi.service.command.CommandProcessor">
-        <reference-listener ref="consoleFactory"
-                            bind-method="registerCommandProcessor"
-                            unbind-method="unregisterCommandProcessor"/>
-    </reference>
-
-    <reference-list id="functions" filter="(&amp;(osgi.command.scope=*)(osgi.command.function=*))"
-                    availability="optional">
-        <reference-listener ref="commandCompleter"
-                            bind-method="register"
-                            unbind-method="unregister"/>
-    </reference-list>
-
-    <bean id="commandCompleter" class="org.apache.felix.karaf.shell.console.completer.CommandsCompleter">
-        <property name="bundleContext" ref="blueprintBundleContext"/>
-    </bean>
-
-    <bean id="consoleFactory" class="org.apache.felix.karaf.shell.console.jline.ConsoleFactory">
-        <property name="start" value="$[karaf.startLocalConsole]"/>
-        <property name="bundleContext" ref="blueprintBundleContext"/>
-        <property name="completers">
-            <list>
-                <ref component-id="commandCompleter"/>
-            </list>
-        </property>
-        <property name="terminalFactory" ref="terminalFactory"/>
-    </bean>
-
-    <bean id="terminalFactory" class="org.apache.felix.karaf.shell.console.jline.TerminalFactory"
-          destroy-method="destroy"/>
-
-
-</blueprint>
diff --git a/karaf/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml b/karaf/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml
deleted file mode 100644
index 870df38..0000000
--- a/karaf/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml
+++ /dev/null
@@ -1,29 +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" value="http://felix.apache.org/karaf/xmlns/shell/v1.0.0"/>
-        </service-properties>
-        <bean class="org.apache.felix.karaf.shell.console.commands.NamespaceHandler"/>
-    </service>
-
-</blueprint>
diff --git a/karaf/shell/console/src/main/resources/org/apache/felix/karaf/shell/console/commands/karaf-shell.xsd b/karaf/shell/console/src/main/resources/org/apache/felix/karaf/shell/console/commands/karaf-shell.xsd
deleted file mode 100644
index 7230804..0000000
--- a/karaf/shell/console/src/main/resources/org/apache/felix/karaf/shell/console/commands/karaf-shell.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://felix.apache.org/karaf/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://felix.apache.org/karaf/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 Felix 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/shell/console/src/test/java/org/apache/felix/gogo/commands/Context.java b/karaf/shell/console/src/test/java/org/apache/felix/gogo/commands/Context.java
deleted file mode 100644
index 1e266da..0000000
--- a/karaf/shell/console/src/test/java/org/apache/felix/gogo/commands/Context.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.felix.gogo.commands;
-
-import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
-import org.apache.felix.gogo.runtime.shell.CommandShellImpl;
-import org.apache.felix.gogo.runtime.shell.CommandSessionImpl;
-
-public class Context extends CommandShellImpl
-{
-    public static final String EMPTY = "";
-    CommandSessionImpl session = (CommandSessionImpl) createSession(System.in, System.out, System.err);
-    static ThreadIOImpl threadio;
-
-    static
-    {
-        threadio = new ThreadIOImpl();
-        threadio.start();
-
-    }
-
-    public Context()
-    {
-        setThreadio(threadio);
-    }
-
-    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);
-    }
-
-
-}
\ No newline at end of file
diff --git a/karaf/shell/console/src/test/java/org/apache/felix/gogo/commands/TestCommands.java b/karaf/shell/console/src/test/java/org/apache/felix/gogo/commands/TestCommands.java
deleted file mode 100644
index 72256e0..0000000
--- a/karaf/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.osgi.service.command.CommandSession;
-import org.apache.felix.gogo.commands.basic.SimpleCommand;
-
-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 (IllegalArgumentException 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;
-        }
-    }
-}
\ No newline at end of file
diff --git a/karaf/shell/dev/pom.xml b/karaf/shell/dev/pom.xml
deleted file mode 100644
index 15a4ca2..0000000
--- a/karaf/shell/dev/pom.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<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.
-  -->
-
-  <parent>
-    <artifactId>shell</artifactId>
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <version>1.7.0-SNAPSHOT</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>org.apache.felix.karaf.shell.dev</artifactId>
-  <packaging>bundle</packaging>
-  <name>Apache Felix Karaf :: Shell Development Commands</name>
-
-  <dependencies>
-    <dependency>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-    </dependency>
-
-    <dependency>
-        <groupId>org.ops4j.pax.url</groupId>
-        <artifactId>pax-url-wrap</artifactId>
-    </dependency>
-
-    <dependency>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>org.osgi.core</artifactId>
-        <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>org.osgi.compendium</artifactId>
-        <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>org.apache.felix.utils</artifactId>
-        <scope>provided</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-      <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>
-                          !${project.artifactId}*,
-                          org.osgi.service.command,
-                          org.apache.felix.gogo.commands,
-                          org.apache.felix.karaf.shell.console,
-                          *
-                      </Import-Package>
-                      <Private-Package>
-                          org.apache.felix.utils.version,
-                          !*
-                      </Private-Package>
-                      <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                  </instructions>
-              </configuration>
-          </plugin>
-      </plugins>
-  </build>  
-
-</project>
\ No newline at end of file
diff --git a/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/AbstractBundleCommand.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/AbstractBundleCommand.java
deleted file mode 100644
index bc4f7b8..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/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.felix.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.felix.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/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/DynamicImport.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/DynamicImport.java
deleted file mode 100644
index 228db5f..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/DynamicImport.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.felix.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.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.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;
-
-/**
- * Command for enabling/disabling debug logging on a bundle and calculating the difference in
- * wired imports.
- */
-@Command(scope = "dev", name = "dynamic-import",
-         description = "Enable/disable dynamic-import for a given bundle")
-public class DynamicImport extends AbstractBundleCommand {
-
-    private static final Log LOG = LogFactory.getLog(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(",");
-            }
-        }
-        return result.toString();
-    }
-}
diff --git a/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/FrameworkDebug.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/FrameworkDebug.java
deleted file mode 100644
index 7413c91..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/FrameworkDebug.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.felix.karaf.shell.dev;
-
-import java.io.File;
-
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.karaf.shell.dev.framework.Equinox;
-import org.apache.felix.karaf.shell.dev.framework.Felix;
-import org.apache.felix.karaf.shell.dev.framework.Framework;
-
-/**
- * Command for enabling/disabling debug logging on the OSGi framework
- */
-@Command(scope = "dev", name = "framework",
-         description = "Enable/disable debugging for the OSGi Framework")
-public class FrameworkDebug 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;
-
-    @Override
-    protected Object doExecute() throws Exception {
-        Framework framework = getFramework();
-
-        if (!debug^nodebug) {
-            System.err.printf("Required option missing: use -debug or -nodebug%n");
-            return null;
-        }
-        if (debug) {
-            System.out.printf("Enabling debug for OSGi framework (%s)%n", framework.getName());
-            framework.enableDebug(new File(KARAF_BASE));
-        }
-        if (nodebug) {
-            System.out.printf("Disabling debug for OSGi framework (%s)%n", framework.getName());
-            framework.disableDebug(new File(KARAF_BASE));
-        }
-
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
-    }
-
-
-    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/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/PrintStackTraces.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/PrintStackTraces.java
deleted file mode 100644
index a34c03d..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/PrintStackTraces.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.felix.karaf.shell.dev;
-
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.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 = "Print 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;
-    }
-
-}
\ No newline at end of file
diff --git a/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/ShowBundleTree.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/ShowBundleTree.java
deleted file mode 100644
index 5c2cbea..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/ShowBundleTree.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.felix.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.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.karaf.shell.dev.util.Bundles;
-import org.apache.felix.karaf.shell.dev.util.Import;
-import org.apache.felix.karaf.shell.dev.util.Node;
-import org.apache.felix.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 = "Show 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/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/framework/Equinox.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/framework/Equinox.java
deleted file mode 100644
index 288697b..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/framework/Equinox.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.karaf.shell.dev.framework;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.felix.karaf.shell.dev.util.IO;
-
-/**
- * Represents Eclipse's Equinox as the underlying OSGi framework
- */
-public class Equinox extends Framework {
-
-    /**
-     * Create a new instance
-     *
-     * @param base 
-     */
-    public Equinox(File base) {
-        super(base);
-    }
-
-    public String getName() {
-        return "Equinox";
-    }
-
-    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/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/framework/Felix.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/framework/Felix.java
deleted file mode 100644
index ff5c6a9..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/framework/Felix.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.felix.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 {
-
-    /**
-     * 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 "Felix";
-    }
-
-    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/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/framework/Framework.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/framework/Framework.java
deleted file mode 100644
index e930549..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/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.felix.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/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/util/Bundles.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/util/Bundles.java
deleted file mode 100644
index acf70eb..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/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.felix.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/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/util/IO.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/util/IO.java
deleted file mode 100644
index 15f5f45..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/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.felix.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/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/util/Import.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/util/Import.java
deleted file mode 100644
index 66ee9c4..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/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.felix.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.felix.karaf;version="1.x" -> org.apache.felix.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/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/util/Node.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/util/Node.java
deleted file mode 100644
index b266fe4..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/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.felix.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.felix.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/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/util/Tree.java b/karaf/shell/dev/src/main/java/org/apache/felix/karaf/shell/dev/util/Tree.java
deleted file mode 100644
index a625780..0000000
--- a/karaf/shell/dev/src/main/java/org/apache/felix/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.felix.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/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml b/karaf/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
deleted file mode 100644
index d19064f..0000000
--- a/karaf/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.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">
-
-    <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="dev/show-tree">
-            <action class="org.apache.felix.karaf.shell.dev.ShowBundleTree"/>
-        </command>
-        <command name="dev/framework">
-            <action class="org.apache.felix.karaf.shell.dev.FrameworkDebug" />
-        </command>
-        <command name="dev/dynamic-import">
-            <action class="org.apache.felix.karaf.shell.dev.DynamicImport" />
-        </command>
-        <command name="dev/print-stack-traces">
-            <action class="org.apache.felix.karaf.shell.dev.PrintStackTraces" />
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/karaf/shell/dev/src/main/resources/org/apache/felix/karaf/shell/dev/framework/equinox-debug.properties b/karaf/shell/dev/src/main/resources/org/apache/felix/karaf/shell/dev/framework/equinox-debug.properties
deleted file mode 100644
index b842875..0000000
--- a/karaf/shell/dev/src/main/resources/org/apache/felix/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/shell/dev/src/test/java/org/apache/felix/karaf/shell/dev/framework/EquinoxTest.java b/karaf/shell/dev/src/test/java/org/apache/felix/karaf/shell/dev/framework/EquinoxTest.java
deleted file mode 100644
index 85ea42c..0000000
--- a/karaf/shell/dev/src/test/java/org/apache/felix/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.felix.karaf.shell.dev.framework;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-import org.apache.felix.karaf.shell.dev.util.IO;
-import static org.junit.Assert.*;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Test cases for {@link org.apache.felix.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/shell/dev/src/test/java/org/apache/felix/karaf/shell/dev/framework/FelixTest.java b/karaf/shell/dev/src/test/java/org/apache/felix/karaf/shell/dev/framework/FelixTest.java
deleted file mode 100644
index 399777b..0000000
--- a/karaf/shell/dev/src/test/java/org/apache/felix/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.felix.karaf.shell.dev.framework;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-import org.apache.felix.karaf.shell.dev.util.IO;
-import static org.junit.Assert.*;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Test cases for {@link org.apache.felix.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/shell/dev/src/test/java/org/apache/felix/karaf/shell/dev/util/BundlesTest.java b/karaf/shell/dev/src/test/java/org/apache/felix/karaf/shell/dev/util/BundlesTest.java
deleted file mode 100644
index 94c28a6..0000000
--- a/karaf/shell/dev/src/test/java/org/apache/felix/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.felix.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.felix.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/shell/dev/src/test/java/org/apache/felix/karaf/shell/dev/util/ImportTest.java b/karaf/shell/dev/src/test/java/org/apache/felix/karaf/shell/dev/util/ImportTest.java
deleted file mode 100644
index f8edd13..0000000
--- a/karaf/shell/dev/src/test/java/org/apache/felix/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.felix.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.felix.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/shell/dev/src/test/java/org/apache/felix/karaf/shell/dev/util/TreeTest.java b/karaf/shell/dev/src/test/java/org/apache/felix/karaf/shell/dev/util/TreeTest.java
deleted file mode 100644
index c11e2c3..0000000
--- a/karaf/shell/dev/src/test/java/org/apache/felix/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.felix.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.felix.karaf.shell.dev.util.Tree}
- * and {@link org.apache.felix.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/shell/dev/src/test/resources/org/apache/felix/karaf/shell/dev/framework/config.properties b/karaf/shell/dev/src/test/resources/org/apache/felix/karaf/shell/dev/framework/config.properties
deleted file mode 100644
index 5cc8009..0000000
--- a/karaf/shell/dev/src/test/resources/org/apache/felix/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.felix.karaf.jaas.boot; version=${karaf.osgi.version}, \
- org.apache.felix.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/shell/dev/src/test/resources/org/apache/felix/karaf/shell/dev/framework/enabled-config.properties b/karaf/shell/dev/src/test/resources/org/apache/felix/karaf/shell/dev/framework/enabled-config.properties
deleted file mode 100644
index 53c4eca..0000000
--- a/karaf/shell/dev/src/test/resources/org/apache/felix/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.felix.karaf.jaas.boot; version=${karaf.osgi.version}, \
- org.apache.felix.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/shell/log/NOTICE b/karaf/shell/log/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/shell/log/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/shell/log/pom.xml b/karaf/shell/log/pom.xml
deleted file mode 100644
index 00663b0..0000000
--- a/karaf/shell/log/pom.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>org.apache.felix.karaf.shell.log</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Shell Log Commands</name>
-
-    <description>
-        Provides the OSGi Log commands
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.ops4j.pax.logging</groupId>
-            <artifactId>pax-logging-service</artifactId>
-        </dependency>
-                
-        <dependency>
-            <groupId>org.ops4j.pax.logging</groupId>
-            <artifactId>pax-logging-api</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <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>
-                            !${project.artifactId}*,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>!*</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/DisplayException.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/DisplayException.java
deleted file mode 100644
index 314adca..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/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.felix.karaf.shell.log;
-
-import org.ops4j.pax.logging.spi.PaxLoggingEvent;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "log", name = "display-exception", description = "Displays the last occured 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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/DisplayLog.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/DisplayLog.java
deleted file mode 100644
index ee62ef7..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/DisplayLog.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.felix.karaf.shell.log;
-
-import org.apache.felix.karaf.shell.log.layout.PatternConverter;
-import org.apache.felix.karaf.shell.log.layout.PatternParser;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.gogo.commands.Command;
-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;
-
-    protected String pattern;
-    protected LruList events;
-
-    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;
-    }
-
-    protected Object doExecute() throws Exception {
-        PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse();
-
-        Iterable<PaxLoggingEvent> le = events.getElements(entries == 0 ? Integer.MAX_VALUE : entries);
-        StringBuffer sb = new StringBuffer();
-        for (PaxLoggingEvent event : le) {
-            sb.setLength(0);
-            for (PatternConverter pc = cnv; pc != null; pc = pc.next) {
-                pc.format(sb, event);
-            }
-            System.out.print(sb.toString());
-            if (event.getThrowableStrRep() != null) {
-                for (String r : event.getThrowableStrRep()) {
-                    System.out.println(r);
-                }
-            }
-        }
-        System.out.println();
-        
-        return null;
-    }
-
-}
diff --git a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/GetLogLevel.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/GetLogLevel.java
deleted file mode 100644
index 618affe..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/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.felix.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.felix.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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/Level.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/Level.java
deleted file mode 100644
index b3192d1..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/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.felix.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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/LruList.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/LruList.java
deleted file mode 100644
index dacf244..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/LruList.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.felix.karaf.shell.log;
-
-import java.util.Arrays;
-
-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;
-
-    public LruList(int size) {
-        if (size <= 0) {
-            throw new IllegalArgumentException("The size must be greater than 0");
-        }
-        elements = new PaxLoggingEvent[size];
-        maxElements = elements.length;
-    }
-
-    public int size() {
-        synchronized (elements) {
-            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 void add(PaxLoggingEvent element) {
-        synchronized (elements) {
-            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;
-            }
-        }
-    }
-
-    public Iterable<PaxLoggingEvent> getElements() {
-        synchronized (elements) {
-            return getElements(size());
-        }
-    }
-
-    public Iterable<PaxLoggingEvent> getElements(int nb) {
-        synchronized (elements) {
-            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);
-        }
-    }
-
-}
diff --git a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/SetLogLevel.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/SetLogLevel.java
deleted file mode 100644
index 7a41d4c..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/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.felix.karaf.shell.log;
-
-import java.io.IOException;
-import java.util.Dictionary;
-
-import org.apache.felix.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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/VmLogAppender.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/VmLogAppender.java
deleted file mode 100644
index cb67733..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/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.felix.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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/completers/LogLevelCompleter.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/completers/LogLevelCompleter.java
deleted file mode 100644
index 122d448..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/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.felix.karaf.shell.log.completers;
-
-import java.util.List;
-
-import org.apache.felix.karaf.shell.console.Completer;
-import org.apache.felix.karaf.shell.console.completer.StringsCompleter;
-import org.apache.felix.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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/AbsoluteTimeDateFormat.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/AbsoluteTimeDateFormat.java
deleted file mode 100644
index 8e443bf..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/AbsoluteTimeDateFormat.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.felix.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".
-
-   @author Ceki G&uuml;lc&uuml;
-   @author Andrew Vajoczki
-
-   @since 0.7.5
-*/
-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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/DateTimeDateFormat.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/DateTimeDateFormat.java
deleted file mode 100644
index 476b03a..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/DateTimeDateFormat.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.felix.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".
-
-   @author Ceki G&uuml;lc&uuml;
-   @since 0.7.5
-*/
-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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/FormattingInfo.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/FormattingInfo.java
deleted file mode 100644
index 75f7834..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/FormattingInfo.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.felix.karaf.shell.log.layout;
-
-
-/**
- * Copied from log4j
- */
-/**
-   FormattingInfo instances contain the information obtained when parsing
-   formatting modifiers in conversion modifiers.
-
-   @author <a href=mailto:jim_cakalic@na.biomerieux.com>Jim Cakalic</a>
-   @author Ceki G&uuml;lc&uuml;
-
-   @since 0.8.2
- */
-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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/ISO8601DateFormat.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/ISO8601DateFormat.java
deleted file mode 100644
index cf3a8ea..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/ISO8601DateFormat.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.felix.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
- */
-// Contributors: Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de>
-/**
-   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.
-
-   @author Ceki G&uuml;lc&uuml;
-   @author Andrew Vajoczki
-
-   @since 0.7.5
-*/
-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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/PatternConverter.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/PatternConverter.java
deleted file mode 100644
index 1554b7f..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/PatternConverter.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.log.layout;
-
-import org.ops4j.pax.logging.spi.PaxLoggingEvent;
-
-/**
-
-   <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.
-
-   @author <a href="mailto:cakalijp@Maritz.com">James P. Cakalic</a>
-   @author Ceki G&uuml;lc&uuml;
-
-   @since 0.8.2
- */
-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/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/PatternParser.java b/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/PatternParser.java
deleted file mode 100644
index f6507f8..0000000
--- a/karaf/shell/log/src/main/java/org/apache/felix/karaf/shell/log/layout/PatternParser.java
+++ /dev/null
@@ -1,567 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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
- */
-// Contributors:   Nelson Minar <(nelson@monkey.org>
-//                 Igor E. Poteryaev <jah@mail.ru>
-//                 Reinhard Deschler <reinhard.deschler@web.de>
-/**
-   Most of the work of the {@link org.apache.log4j.PatternLayout} class
-   is delegated to the PatternParser class.
-
-   @author <a href=mailto:"cakalijp@Maritz.com">James P. Cakalic</a>
-   @author Ceki G&uuml;lc&uuml;
-   @author Anders Kristensen
-
-   @since 0.8.2
-*/
-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/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml b/karaf/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml
deleted file mode 100644
index fff1541..0000000
--- a/karaf/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml
+++ /dev/null
@@ -1,77 +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">
-
-    <!-- TODO: use dynamic CM config -->
-
-    <cm:property-placeholder persistent-id="org.apache.felix.karaf.log">
-        <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:default-properties>
-    </cm:property-placeholder>
-
-    <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="log/display">
-            <action class="org.apache.felix.karaf.shell.log.DisplayLog">
-                <property name="events" ref="events"/>
-                <property name="pattern" value="${pattern}"/>
-            </action>
-        </command>
-        <link name="log/d" target="log/display"/>
-        <command name="log/display-exception">
-            <action class="org.apache.felix.karaf.shell.log.DisplayException">
-                <property name="events" ref="events"/>
-            </action>
-        </command>
-        <link name="log/de" target="log/display-exception"/>
-        <command name="log/get">
-            <action class="org.apache.felix.karaf.shell.log.GetLogLevel" />
-        </command>
-        <command name="log/set">
-            <action class="org.apache.felix.karaf.shell.log.SetLogLevel" />
-            <completers>
-            	<ref component-id="logLevelCompleter"/>
-            	<null/>
-            </completers>
-        </command>
-
-        <alias name="ld" alias="log/d"/>
-        <alias name="lde" alias="log/de"/>
-    </command-bundle>
-
-    <bean id="vmLogAppender" class="org.apache.felix.karaf.shell.log.VmLogAppender">
-        <property name="events" ref="events"/>
-    </bean>
-
-    <bean id="events" class="org.apache.felix.karaf.shell.log.LruList">
-        <argument value="${size}"/>
-    </bean>
-    
-    <bean id="logLevelCompleter" class="org.apache.felix.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/shell/log/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf/shell/log/src/main/resources/OSGI-INF/metatype/metatype.properties
deleted file mode 100644
index 96bb60b..0000000
--- a/karaf/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 Felix Karaf Log
-log.description = Configuration of Apache Felix 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/shell/log/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf/shell/log/src/main/resources/OSGI-INF/metatype/metatype.xml
deleted file mode 100644
index c41898a..0000000
--- a/karaf/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.felix.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.felix.karaf.log">
-        <Object ocdref="org.apache.felix.karaf.log"/>
-    </Designate>
-</metatype:MetaData>
diff --git a/karaf/shell/log/src/test/java/org/apache/felix/karaf/shell/log/SetLogLevelTest.java b/karaf/shell/log/src/test/java/org/apache/felix/karaf/shell/log/SetLogLevelTest.java
deleted file mode 100644
index db95924..0000000
--- a/karaf/shell/log/src/test/java/org/apache/felix/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.felix.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/shell/log/src/test/java/org/apache/felix/karaf/shell/log/completers/LogLevelCompleterTest.java b/karaf/shell/log/src/test/java/org/apache/felix/karaf/shell/log/completers/LogLevelCompleterTest.java
deleted file mode 100644
index a7a1cf5..0000000
--- a/karaf/shell/log/src/test/java/org/apache/felix/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.felix.karaf.shell.log.completers;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.felix.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/shell/obr/NOTICE b/karaf/shell/obr/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/shell/obr/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/shell/obr/pom.xml b/karaf/shell/obr/pom.xml
deleted file mode 100644
index 2541b80..0000000
--- a/karaf/shell/obr/pom.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>org.apache.felix.karaf.shell.obr</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Shell OBR Commands</name>
-
-    <description>
-        Provides the OBR Shell commands
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.bundlerepository</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <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>
-                            !${project.artifactId}*,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>!*</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/AddUrlCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/AddUrlCommand.java
deleted file mode 100644
index 3ccb1fe..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/AddUrlCommand.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.felix.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);
-        }
-    }
-}
diff --git a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/DeployCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/DeployCommand.java
deleted file mode 100644
index b29b8c2..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/DeployCommand.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.felix.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 = "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;
-
-    protected void doExecute(RepositoryAdmin admin) throws Exception {
-        doDeploy(admin, bundles, false);
-    }
-
-}
diff --git a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/FindCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/FindCommand.java
deleted file mode 100644
index e1b5462..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/FindCommand.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.obr;
-
-import java.io.PrintStream;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.felix.bundlerepository.Capability;
-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.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.Version;
-
-@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 {
-        List<Resource> matching = new ArrayList<Resource>();
-        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());
-            }
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/InfoCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/InfoCommand.java
deleted file mode 100644
index b5d5915..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/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.felix.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/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/ListCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/ListCommand.java
deleted file mode 100644
index bb76b86..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/ListCommand.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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")
-public class ListCommand extends ObrCommandSupport {
-
-    @Argument(index = 0, name = "args", description = "The arguments", required = false, multiValued = true)
-    List<String> args;
-
-    protected void doExecute(RepositoryAdmin admin) throws Exception {
-        String substr = null;
-
-        if (args != null) {
-            for (String arg : args)
-            {
-                // 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();
-            Version version = resources[resIdx].getVersion();
-            if (version != null)
-            {
-                System.out.println(name + " (" + version + ")");
-            }
-            else
-            {
-                System.out.println(name);
-            }
-        }
-
-        if (resources == null)
-        {
-            System.out.println("No matching bundles.");
-        }
-    }
-
-}
diff --git a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/ListUrlCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/ListUrlCommand.java
deleted file mode 100644
index 6dc9487..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/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.felix.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/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/ObrCommandSupport.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/ObrCommandSupport.java
deleted file mode 100644
index 6a2afba..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/ObrCommandSupport.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.obr;
-
-import java.io.PrintStream;
-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.karaf.shell.console.OsgiCommandSupport;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.Version;
-
-public abstract class ObrCommandSupport extends OsgiCommandSupport {
-
-    protected static final char VERSION_DELIM = ',';
-
-    protected Object doExecute() throws Exception {
-        // Get repository admin service.
-        ServiceReference ref = getBundleContext().getServiceReference(RepositoryAdmin.class.getName());
-        if (ref == null) {
-            System.out.println("RepositoryAdmin service is unavailable.");
-            return null;
-        }
-        try {
-            RepositoryAdmin admin = (RepositoryAdmin) getBundleContext().getService(ref);
-            if (admin == null) {
-                System.out.println("RepositoryAdmin service is unavailable.");
-                return null;
-            }
-
-            doExecute(admin);
-        }
-        finally {
-            getBundleContext().ungetService(ref);
-        }
-        return null;
-    }
-
-    protected abstract void doExecute(RepositoryAdmin admin) throws Exception;
-
-    protected Resource[] searchRepository(RepositoryAdmin admin, String targetId, String targetVersion) throws InvalidSyntaxException
-    {
-        // Try to see if the targetId is a bundle ID.
-        try
-        {
-            Bundle bundle = getBundleContext().getBundle(Long.parseLong(targetId));
-            targetId = bundle.getSymbolicName();
-        }
-        catch (NumberFormatException ex)
-        {
-            // It was not a number, so ignore.
-        }
-
-        // The targetId may be a bundle name or a bundle symbolic name,
-        // so create the appropriate LDAP query.
-        StringBuffer sb = new StringBuffer("(|(presentationname=");
-        sb.append(targetId);
-        sb.append(")(symbolicname=");
-        sb.append(targetId);
-        sb.append("))");
-        if (targetVersion != null)
-        {
-            sb.insert(0, "(&");
-            sb.append("(version=");
-            sb.append(targetVersion);
-            sb.append("))");
-        }
-        return admin.discoverResources(sb.toString());
-    }
-
-    public Resource selectNewestVersion(Resource[] resources)
-    {
-        int idx = -1;
-        Version v = null;
-        for (int i = 0; (resources != null) && (i < resources.length); i++)
-        {
-            if (i == 0)
-            {
-                idx = 0;
-                v = resources[i].getVersion();
-            }
-            else
-            {
-                Version vtmp = resources[i].getVersion();
-                if (vtmp.compareTo(v) > 0)
-                {
-                    idx = i;
-                    v = vtmp;
-                }
-            }
-        }
-        return (idx < 0) ? null : resources[idx];
-    }
-
-    protected String[] getTarget(String bundle) {
-        String[] target;
-        int idx = bundle.indexOf(VERSION_DELIM);
-        if (idx > 0) {
-            target = new String[] { bundle.substring(0, idx), bundle.substring(idx+1) };
-        }
-        else
-        {
-            target = new String[] { bundle, null };
-        }
-        return target;
-    }
-
-    protected void printUnderline(PrintStream out, int length)
-    {
-        for (int i = 0; i < length; i++)
-        {
-            out.print('-');
-        }
-        out.println("");
-    }
-
-    protected void doDeploy(RepositoryAdmin admin, List<String> bundles, boolean start) throws Exception {
-        Resolver resolver = admin.resolver();
-        for (String bundle : bundles) {
-            String[] target = getTarget(bundle);
-            Resource resource = selectNewestVersion(searchRepository(admin, target[0], target[1]));
-            if (resource != null)
-            {
-                resolver.add(resource);
-            }
-            else
-            {
-                System.err.println("Unknown bundle - " + target[0]);
-            }
-        }
-        if ((resolver.getAddedResources() != null) &&
-            (resolver.getAddedResources().length > 0))
-        {
-            if (resolver.resolve())
-            {
-                System.out.println("Target resource(s):");
-                printUnderline(System.out, 19);
-                Resource[] resources = resolver.getAddedResources();
-                for (int resIdx = 0; (resources != null) && (resIdx < resources.length); resIdx++)
-                {
-                    System.out.println("   " + resources[resIdx].getPresentationName()
-                        + " (" + resources[resIdx].getVersion() + ")");
-                }
-                resources = resolver.getRequiredResources();
-                if ((resources != null) && (resources.length > 0))
-                {
-                    System.out.println("\nRequired resource(s):");
-                    printUnderline(System.out, 21);
-                    for (int resIdx = 0; resIdx < resources.length; resIdx++)
-                    {
-                        System.out.println("   " + resources[resIdx].getPresentationName()
-                            + " (" + resources[resIdx].getVersion() + ")");
-                    }
-                }
-                resources = resolver.getOptionalResources();
-                if ((resources != null) && (resources.length > 0))
-                {
-                    System.out.println("\nOptional resource(s):");
-                    printUnderline(System.out, 21);
-                    for (int resIdx = 0; resIdx < resources.length; resIdx++)
-                    {
-                        System.out.println("   " + resources[resIdx].getPresentationName()
-                            + " (" + resources[resIdx].getVersion() + ")");
-                    }
-                }
-
-                try
-                {
-                    System.out.print("\nDeploying...");
-                    resolver.deploy(start ? Resolver.START : 0);
-                    System.out.println("done.");
-                }
-                catch (IllegalStateException ex)
-                {
-                    System.err.println(ex);
-                }
-            }
-            else
-            {
-                Reason[] reqs = resolver.getUnsatisfiedRequirements();
-                if ((reqs != null) && (reqs.length > 0))
-                {
-                    System.out.println("Unsatisfied requirement(s):");
-                    printUnderline(System.out, 27);
-                    for (int reqIdx = 0; reqIdx < reqs.length; reqIdx++)
-                    {
-                        System.out.println("   " + reqs[reqIdx].getRequirement().getFilter());
-                        System.out.println("      " + reqs[reqIdx].getResource().getPresentationName());
-                    }
-                }
-                else
-                {
-                    System.out.println("Could not resolve targets.");
-                }
-            }
-        }
-
-    }
-
-
-    protected Requirement parseRequirement(RepositoryAdmin admin, String req) throws InvalidSyntaxException {
-        int p = req.indexOf(':');
-        String name;
-        String filter;
-        if (p > 0) {
-            name = req.substring(0, p);
-            filter = req.substring(p + 1);
-        } else {
-            if (req.contains("package")) {
-                name = "package";
-            } else if (req.contains("service")) {
-                name = "service";
-            } else {
-                name = "bundle";
-            }
-            filter = req;
-        }
-        if (!filter.startsWith("(")) {
-            filter = "(" + filter + ")";
-        }
-        return admin.getHelper().requirement(name, filter);
-    }
-
-    protected Requirement[] parseRequirements(RepositoryAdmin admin, List<String> requirements) throws InvalidSyntaxException {
-        Requirement[] reqs = new Requirement[requirements.size()];
-        for (int i = 0; i < reqs.length; i++) {
-            reqs[i] = parseRequirement(admin, requirements.get(i));
-        }
-        return reqs;
-    }
-
-}
diff --git a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/RefreshUrlCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/RefreshUrlCommand.java
deleted file mode 100644
index 7509842..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/RefreshUrlCommand.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.felix.karaf.shell.obr;
-
-import java.util.List;
-
-import org.apache.felix.bundlerepository.Repository;
-import org.apache.felix.bundlerepository.RepositoryAdmin;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "obr", name = "refreshUrl", description = "Reloads the repositories to obtain a fresh list of bundles.")
-public class RefreshUrlCommand extends ObrCommandSupport {
-
-    @Argument(index = 0, name = "urls", description = "Repository URLs to refresh (leave empty for all)", required = false, multiValued = true)
-    List<String> urls;
-
-    protected void doExecute(RepositoryAdmin admin) throws Exception {
-		if (urls != null && !urls.isEmpty()) {
-			for (String url : urls) {
-				admin.addRepository(url);
-			}
-		} else {
-			Repository[] repos = admin.listRepositories();
-			if ((repos != null) && (repos.length > 0)) {
-				for (int i = 0; i < repos.length; i++) {
-					admin.addRepository(repos[i].getURI());
-				}
-			}
-		}
-    }
-
-}
diff --git a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/RemoveUrlCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/RemoveUrlCommand.java
deleted file mode 100644
index 3ae7e4a..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/RemoveUrlCommand.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.felix.karaf.shell.obr;
-
-import java.util.List;
-
-import org.apache.felix.bundlerepository.RepositoryAdmin;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "obr", name = "removeUrl", description = "Removes a list of repository URLs from the OBR service.")
-public class RemoveUrlCommand extends ObrCommandSupport {
-
-    @Argument(index = 0, name = "urls", description = "Repository URLs to remove from OBR service", required = true, multiValued = true)
-    List<String> urls;
-
-    protected void doExecute(RepositoryAdmin admin) throws Exception {
-        for (String url : urls) {
-            admin.removeRepository(url);
-        }
-    }
-}
diff --git a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/ResolveCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/ResolveCommand.java
deleted file mode 100644
index 251f63f..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/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.felix.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 = "Show 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.");
-            }
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/SourceCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/SourceCommand.java
deleted file mode 100644
index 403b05c..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/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.felix.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.felix.karaf.shell.obr.util.FileUtil;
-
-@Command(scope = "obr", name = "source", description = "Download 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/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/StartCommand.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/StartCommand.java
deleted file mode 100644
index f662881..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/StartCommand.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.felix.karaf.shell.obr;
-
-import org.apache.felix.bundlerepository.RepositoryAdmin;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "obr", name = "start", description = "Deploy and start a list of bundles using OBR.")
-public class StartCommand extends DeployCommand {
-
-    protected void doExecute(RepositoryAdmin admin) throws Exception {
-        doDeploy(admin, bundles, true);
-    }
-
-}
diff --git a/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/util/FileUtil.java b/karaf/shell/obr/src/main/java/org/apache/felix/karaf/shell/obr/util/FileUtil.java
deleted file mode 100644
index 7ebfbb4..0000000
--- a/karaf/shell/obr/src/main/java/org/apache/felix/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.felix.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/shell/obr/src/main/resources/OSGI-INF/blueprint/shell-obr.xml b/karaf/shell/obr/src/main/resources/OSGI-INF/blueprint/shell-obr.xml
deleted file mode 100644
index b56ed03..0000000
--- a/karaf/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">
-
-    <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="obr/addUrl">
-            <action class="org.apache.felix.karaf.shell.obr.AddUrlCommand"/>
-        </command>
-        <command name="obr/deploy">
-            <action class="org.apache.felix.karaf.shell.obr.DeployCommand"/>
-        </command>
-        <command name="obr/find">
-            <action class="org.apache.felix.karaf.shell.obr.FindCommand"/>
-        </command>
-        <command name="obr/info">
-            <action class="org.apache.felix.karaf.shell.obr.InfoCommand"/>
-        </command>
-        <command name="obr/list">
-            <action class="org.apache.felix.karaf.shell.obr.ListCommand"/>
-        </command>
-        <command name="obr/listUrl">
-            <action class="org.apache.felix.karaf.shell.obr.ListUrlCommand"/>
-        </command>
-        <command name="obr/refreshUrl">
-            <action class="org.apache.felix.karaf.shell.obr.RefreshUrlCommand"/>
-        </command>
-        <command name="obr/removeUrl">
-            <action class="org.apache.felix.karaf.shell.obr.RemoveUrlCommand"/>
-        </command>
-        <command name="obr/resolve">
-            <action class="org.apache.felix.karaf.shell.obr.ResolveCommand"/>
-        </command>
-        <command name="obr/source">
-            <action class="org.apache.felix.karaf.shell.obr.SourceCommand"/>
-        </command>
-        <command name="obr/start">
-            <action class="org.apache.felix.karaf.shell.obr.StartCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/karaf/shell/osgi/NOTICE b/karaf/shell/osgi/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/shell/osgi/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/shell/osgi/pom.xml b/karaf/shell/osgi/pom.xml
deleted file mode 100644
index 16c2789..0000000
--- a/karaf/shell/osgi/pom.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>org.apache.felix.karaf.shell.osgi</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Shell OSGi Commands</name>
-
-    <description>
-        Provides the OSGi Shell commands
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</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>
-        <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>
-                            !${project.artifactId}*,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            org.springframework*;resolution:=optional,
-                            *
-                        </Import-Package>
-                        <DynamicImport-Package>
-                            org.springframework.*
-                        </DynamicImport-Package>
-                        <Private-Package>!*</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BlueprintListener.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BlueprintListener.java
deleted file mode 100644
index 5c02f11..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/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.felix.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/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundleCommand.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundleCommand.java
deleted file mode 100644
index f5f074d..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/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.felix.karaf.shell.osgi;
-
-import org.apache.felix.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/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundleLevel.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundleLevel.java
deleted file mode 100644
index 3eca185..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/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.felix.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 = "Get or set the start level of a given bundle")
-public class BundleLevel extends BundleCommand {
-
-    @Argument(index = 1, name = "startLevel", description = "The bundles 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 want 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/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundleStateListener.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundleStateListener.java
deleted file mode 100644
index 3f37c48..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/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.felix.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/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundlesCommand.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundlesCommand.java
deleted file mode 100644
index f2bee4d..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundlesCommand.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.felix.karaf.shell.osgi;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Option;
-import org.osgi.framework.Bundle;
-
-public abstract class BundlesCommand extends OsgiCommandSupport {
-
-    @Argument(index = 0, name = "ids", description = "The list of bundle IDs separated by whitespaces", required = true, multiValued = true)
-    List<Long> 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 = new ArrayList<Bundle>();
-        if (ids != null && !ids.isEmpty()) {
-            for (long id : ids) {
-                Bundle bundle = getBundleContext().getBundle(id);
-                if (bundle == null) {
-                    System.err.println("Bundle ID" + id + " is invalid");
-                } else {
-                    if (force || !Util.isASystemBundle(getBundleContext(), bundle) || Util.accessToSystemBundleIsAllowed(bundle.getBundleId(), session)) {
-                        bundles.add(bundle);
-                    }
-                }
-            }
-        }
-        doExecute(bundles);
-        return null;
-    }
-
-    protected abstract void doExecute(List<Bundle> bundles) throws Exception;
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundlesCommandOptional.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundlesCommandOptional.java
deleted file mode 100644
index 13974e0..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/BundlesCommandOptional.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.felix.karaf.shell.osgi;
-
-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.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 IDs separated by whitespaces", required = false, multiValued = true)
-    List<Long> 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 = new ArrayList<Bundle>();
-        if (ids != null && !ids.isEmpty()) {
-            for (long id : ids) {
-                Bundle bundle = getBundleContext().getBundle(id);
-                if (bundle == null) {
-                    System.err.println("Bundle ID" + id + " is invalid");
-                } else {
-                    if (force || !Util.isASystemBundle(getBundleContext(), bundle) || Util.accessToSystemBundleIsAllowed(bundle.getBundleId(), session)) {
-                        bundles.add(bundle);
-                    }
-                }
-            }
-        }
-        doExecute(bundles);
-        return null;
-    }
-
-    protected abstract void doExecute(List<Bundle> bundles) throws Exception;
-}
\ No newline at end of file
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/Headers.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/Headers.java
deleted file mode 100644
index 712a968..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/Headers.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.karaf.shell.osgi;
-
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.List;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.osgi.framework.Bundle;
-
-@Command(scope = "osgi", name = "headers", description = "Displays OSGi headers of a given bundle")
-public class Headers extends OsgiCommandSupport {
-
-    @Argument(index = 0, name = "ids", description = "A list of bundle IDs separated by whitespaces", required = false, multiValued = true)
-    List<Long> ids;
-
-    protected Object doExecute() throws Exception {
-        if (ids != null && !ids.isEmpty()) {
-            for (long id : ids) {
-                Bundle bundle = getBundleContext().getBundle(id);
-                if (bundle != null) {
-                    printHeaders(bundle);
-                }
-                else {
-                    System.err.println("Bundle ID " + id + " is invalid.");
-                }
-            }
-        }
-        else {
-            Bundle[] bundles = getBundleContext().getBundles();
-            for (int i = 0; i < bundles.length; i++) {
-                printHeaders(bundles[i]);
-            }
-        }
-        return null;
-    }
-
-    protected void printHeaders(Bundle bundle) throws Exception {
-        String title = Util.getBundleName(bundle);
-        System.out.println("\n" + title);
-        System.out.println(Util.getUnderlineString(title));
-        Dictionary dict = bundle.getHeaders();
-        Enumeration keys = dict.keys();
-        while (keys.hasMoreElements())
-        {
-            Object k = (String) keys.nextElement();
-            Object v = dict.get(k);
-            System.out.println(k + " = " + Util.getValueString(v));
-        }
-    }
-
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/InstallBundle.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/InstallBundle.java
deleted file mode 100644
index c777b51..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/InstallBundle.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.felix.karaf.shell.osgi;
-
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.gogo.commands.Command;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-
-@Command(scope = "osgi", name = "install", description = "Installs one or more bundles")
-public class InstallBundle extends OsgiCommandSupport {
-
-    @Argument(index = 0, name = "urls", description = "Bundle URLs separated by whitespaces", required = true, multiValued = true)
-    List<String> urls;
-
-    @Option(name = "-s", aliases={"--start"}, description="Starts the bundles after installation", required = false, multiValued = false)
-    boolean start;
-
-    protected Object doExecute() throws Exception {
-        List<Bundle> bundles = new ArrayList<Bundle>();
-        StringBuffer sb = new StringBuffer();
-        for (String url : urls) {
-            Bundle bundle = install(url, System.out, System.err);
-            if (bundle != null) {
-                bundles.add(bundle);
-                if (sb.length() > 0) {
-                    sb.append(", ");
-                }
-                sb.append(bundle.getBundleId());
-            }
-        }
-        if (start) {
-            for (Bundle bundle : bundles) {
-                bundle.start();
-            }
-        }
-        if (sb.toString().indexOf(',') > 0) {
-            System.out.println("Bundle IDs: " + sb.toString());
-        } else if (sb.length() > 0) {
-            System.out.println("Bundle ID: " + sb.toString());
-        }
-        return null;
-    }
-
-    protected Bundle install(String location, PrintStream out, PrintStream err) {
-        try {
-            return getBundleContext().installBundle(location, null);
-        } catch (IllegalStateException ex) {
-            err.println(ex.toString());
-        } catch (BundleException ex) {
-            if (ex.getNestedException() != null) {
-                err.println(ex.getNestedException().toString());
-            } else {
-                err.println(ex.toString());
-            }
-        } catch (Exception ex) {
-            err.println(ex.toString());
-        }
-        return null;
-    }
-
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/ListBundles.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/ListBundles.java
deleted file mode 100644
index 523ec00..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/ListBundles.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.osgi;
-
-import java.util.List;
-
-import org.apache.felix.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;
-
-    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) {
-            // Display active start level.
-            if (sl != null) {
-                System.out.println("START LEVEL " + sl.getStartLevel());
-            }
-
-            // 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++) {
-                // 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/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/ListServices.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/ListServices.java
deleted file mode 100644
index 8685df7..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/ListServices.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.osgi;
-
-import java.util.List;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-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.ServiceReference;
-import org.osgi.service.command.Function;
-
-@Command(scope = "osgi", name = "ls", description = "Lists OSGi services")
-public class ListServices extends OsgiCommandSupport {
-
-    @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;
-
-    @Argument(index = 0, name = "ids", description = "Show only services for the given bundle ids", required = false, multiValued = true)
-    List<Long> ids;
-
-    protected Object doExecute() throws Exception {
-        if (ids != null && !ids.isEmpty()) {
-            for (long id : ids) {
-                Bundle bundle = getBundleContext().getBundle(id);
-                if (bundle != null) {
-                    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;
-                        }
-                    }
-                } else {
-                    System.err.println("Bundle ID " + id + " is invalid.");
-                }
-            }
-        }
-        else
-        {
-            Bundle[] bundles = getBundleContext().getBundles();
-            if (bundles != null)
-            {
-                // TODO: Sort list.
-                for (int bundleIdx = 0; bundleIdx < bundles.length; bundleIdx++)
-                {
-                    boolean headerPrinted = false;
-                    ServiceReference[] refs = null;
-
-                    // Get registered or in-use services.
-                    if (inUse)
-                    {
-                        refs = bundles[bundleIdx].getServicesInUse();
-                    }
-                    else
-                    {
-                        refs = bundles[bundleIdx].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(bundles[bundleIdx]);
-                                title = (inUse)
-                                    ? title + " uses:"
-                                    : title + " provides:";
-                                System.out.println("\n" + title);
-                                System.out.println(Util.getUnderlineString(title));
-                            }
-                            System.out.println(Util.getValueString(objectClass));
-                        }
-                    }
-                }
-            }
-            else
-            {
-                System.out.println("There are no registered services.");
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/RefreshBundle.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/RefreshBundle.java
deleted file mode 100644
index 4bca7d0..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/RefreshBundle.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.felix.karaf.shell.osgi;
-
-import java.util.List;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-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.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.isEmpty()) {
-                pa.refreshPackages(null);
-            }
-            else {
-                pa.refreshPackages(bundles.toArray(new Bundle[bundles.size()]));
-            }
-        }
-        finally {
-            getBundleContext().ungetService(ref);
-        }
-    }
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/ResolveBundle.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/ResolveBundle.java
deleted file mode 100644
index b717e9d..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/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.felix.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.isEmpty()) {
-                pa.resolveBundles(null);
-            } else {
-                pa.resolveBundles(bundles.toArray(new Bundle[bundles.size()]));
-            }
-        }
-        finally {
-            getBundleContext().ungetService(ref);
-        }
-    }
-
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/RestartBundle.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/RestartBundle.java
deleted file mode 100644
index 9085395..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/RestartBundle.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.felix.karaf.shell.osgi;
-
-import java.util.List;
-
-import org.osgi.framework.Bundle;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "osgi", name = "restart", description = "Stop and restart bundle(s)")
-public class RestartBundle extends BundlesCommand {
-
-    protected void doExecute(List<Bundle> bundles) throws Exception {
-        for (Bundle bundle : bundles) {
-            bundle.stop();
-        }
-        for (Bundle bundle : bundles) {
-            bundle.start();
-        }
-    }
-
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/Shutdown.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/Shutdown.java
deleted file mode 100644
index 12d364b..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/Shutdown.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.felix.karaf.shell.osgi;
-
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Command;
-import org.osgi.framework.Bundle;
-
-/**
- * Command to shut down Karaf
- */
-@Command(scope = "osgi", name = "shutdown", description = "Shuts the framework down")
-public class Shutdown extends OsgiCommandSupport {
-
-    protected Object doExecute() throws Exception {
-        new Thread() {
-            public void run() {
-                try {
-                    Bundle bundle = getBundleContext().getBundle(0);
-                    bundle.stop();
-                } catch (Exception e) {
-                    log.error("Error when shutting down Apache Felix Karaf", e);
-                }
-            }
-        }.start();
-        return null;
-    }
-
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/SpringStateListenerFactory.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/SpringStateListenerFactory.java
deleted file mode 100644
index 9a0069c..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/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.felix.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.felix.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/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/StartBundle.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/StartBundle.java
deleted file mode 100644
index 4a0cb0f..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/StartBundle.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.felix.karaf.shell.osgi;
-
-import java.util.List;
-
-import org.osgi.framework.Bundle;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "osgi", name = "start", description = "Start bundle(s)")
-public class StartBundle extends BundlesCommand {
-    
-    protected void doExecute(List<Bundle> bundles) throws Exception {
-        for (Bundle bundle : bundles) {
-            bundle.start();
-        }
-    }
-
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/StartLevel.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/StartLevel.java
deleted file mode 100644
index d266422..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/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.felix.karaf.shell.osgi;
-
-import org.apache.felix.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 = "Get or set 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/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/StopBundle.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/StopBundle.java
deleted file mode 100644
index 5036e01..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/StopBundle.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.felix.karaf.shell.osgi;
-
-import java.util.List;
-
-import org.osgi.framework.Bundle;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "osgi", name = "stop", description = "Stop bundle(s)")
-public class StopBundle extends BundlesCommand {
-	
-	protected void doExecute(List<Bundle> bundles) throws Exception {
-        for (Bundle bundle : bundles) {
-            bundle.stop();
-        }
-    }
-
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/UninstallBundle.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/UninstallBundle.java
deleted file mode 100644
index e8a8e51..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/UninstallBundle.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.felix.karaf.shell.osgi;
-
-import java.util.List;
-
-import org.osgi.framework.Bundle;
-import org.apache.felix.gogo.commands.Command;
-
-@Command(scope = "osgi", name = "uninstall", description = "Uninstall bundle(s)")
-public class UninstallBundle extends BundlesCommand {
-
-    protected void doExecute(List<Bundle> bundles) throws Exception {
-        for (Bundle bundle : bundles) {
-            bundle.uninstall();
-        }
-    }
-
-}
diff --git a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/UpdateBundle.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/UpdateBundle.java
deleted file mode 100644
index 6ee1a0a..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/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.felix.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/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/Util.java b/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/Util.java
deleted file mode 100644
index 94071df..0000000
--- a/karaf/shell/osgi/src/main/java/org/apache/felix/karaf/shell/osgi/Util.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.osgi;
-
-import java.io.IOException;
-
-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.osgi.service.command.CommandSession;
-
-public class Util
-{
-    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;
-                m_sb.delete(0, m_sb.length());
-                for (int i = 0; i < array.length; i++)
-                {
-                    if (i != 0)
-                    {
-                        m_sb.append(", ");
-                    }
-                    m_sb.append(array[i].toString());
-                }
-                return m_sb.toString();
-            }
-            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 == null)
-            {
-                return "null";
-            }
-            else
-            {
-                return obj.toString();
-            }
-        }
-    }
-
-    /**
-     * 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 want 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/shell/osgi/src/main/resources/OSGI-INF/blueprint/shell-osgi.xml b/karaf/shell/osgi/src/main/resources/OSGI-INF/blueprint/shell-osgi.xml
deleted file mode 100644
index 9885d4e..0000000
--- a/karaf/shell/osgi/src/main/resources/OSGI-INF/blueprint/shell-osgi.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">
-
-    <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="osgi/bundle-level">
-            <action class="org.apache.felix.karaf.shell.osgi.BundleLevel"/>
-        </command>
-        <command name="osgi/headers">
-            <action class="org.apache.felix.karaf.shell.osgi.Headers"/>
-        </command>
-        <command name="osgi/install">
-            <action class="org.apache.felix.karaf.shell.osgi.InstallBundle"/>
-        </command>
-        <command name="osgi/list">
-            <action class="org.apache.felix.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.felix.karaf.shell.osgi.ListServices"/>
-        </command>
-        <command name="osgi/refresh">
-            <action class="org.apache.felix.karaf.shell.osgi.RefreshBundle"/>
-        </command>
-        <command name="osgi/update">
-            <action class="org.apache.felix.karaf.shell.osgi.UpdateBundle"/>
-        </command>
-        <command name="osgi/resolve">
-            <action class="org.apache.felix.karaf.shell.osgi.ResolveBundle"/>
-        </command>
-        <command name="osgi/restart">
-            <action class="org.apache.felix.karaf.shell.osgi.RestartBundle"/>
-        </command>
-        <command name="osgi/shutdown">
-            <action class="org.apache.felix.karaf.shell.osgi.Shutdown"/>
-        </command>
-        <command name="osgi/start">
-            <action class="org.apache.felix.karaf.shell.osgi.StartBundle"/>
-        </command>
-        <command name="osgi/start-level">
-            <action class="org.apache.felix.karaf.shell.osgi.StartLevel"/>
-        </command>
-        <command name="osgi/stop">
-            <action class="org.apache.felix.karaf.shell.osgi.StopBundle"/>
-        </command>
-        <command name="osgi/uninstall">
-            <action class="org.apache.felix.karaf.shell.osgi.UninstallBundle"/>
-        </command>
-    </command-bundle>
-
-    <bean id="blueprintListener" class="org.apache.felix.karaf.shell.osgi.BlueprintListener" />
-    <service ref="blueprintListener" interface="org.osgi.service.blueprint.container.BlueprintListener" />
-
-    <bean id="springListener" class="org.apache.felix.karaf.shell.osgi.SpringStateListenerFactory" init-method="init" destroy-method="destroy">
-        <property name="bundleContext" ref="blueprintBundleContext" />
-    </bean>
-
-</blueprint>
\ No newline at end of file
diff --git a/karaf/shell/packages/NOTICE b/karaf/shell/packages/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/shell/packages/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/shell/packages/pom.xml b/karaf/shell/packages/pom.xml
deleted file mode 100644
index 0ad221e..0000000
--- a/karaf/shell/packages/pom.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>org.apache.felix.karaf.shell.packages</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Shell PackageAdmin Commands</name>
-
-    <description>
-        Provides the PackageAdmin Shell commands
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <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>
-                            !${project.artifactId}*,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>!*</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/shell/packages/src/main/java/org/apache/felix/karaf/shell/packages/ExportsCommand.java b/karaf/shell/packages/src/main/java/org/apache/felix/karaf/shell/packages/ExportsCommand.java
deleted file mode 100644
index f823d7e..0000000
--- a/karaf/shell/packages/src/main/java/org/apache/felix/karaf/shell/packages/ExportsCommand.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.felix.karaf.shell.packages;
-
-import java.io.PrintStream;
-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 = "Display exported packages")
-public class ExportsCommand extends PackageCommandSupport {
-
-    @Option(name = "-i", aliases = { "--imports"}, description = "List bundles importing the specified packages")
-    boolean imports;
-
-    @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 {
-        if (ids != null && !ids.isEmpty()) {
-            for (long id : ids) {
-                Bundle bundle = getBundleContext().getBundle(id);
-                if (bundle != null) {
-                    printExports(System.out, bundle, admin.getExportedPackages(bundle));
-                } else {
-                    System.err.println("Bundle ID " + id + " is invalid.");
-                }
-            }
-        }
-        else {
-            printExports(System.out, null, admin.getExportedPackages((Bundle) null));
-        }
-    }
-
-    protected void printExports(PrintStream out, Bundle target, ExportedPackage[] exports) {
-        if ((exports != null) && (exports.length > 0)) {
-            for (int i = 0; i < exports.length; i++) {
-                Bundle bundle = exports[i].getExportingBundle();
-                out.print(getBundleName(bundle));
-                out.println(": " + exports[i]);
-                if (imports) {
-                    Bundle[] bs = exports[i].getImportingBundles();
-                    if (bs != null) {
-                        for (Bundle b : bs) {
-                            out.println("\t" + getBundleName(b));
-                        }
-                    }
-                }
-            }
-        } else {
-            out.println(getBundleName(target) + ": No active exported packages.");
-        }
-    }
-
-    public static String getBundleName(Bundle bundle) {
-        if (bundle != null) {
-            String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME);
-            return (name == null)
-                ? "Bundle " + Long.toString(bundle.getBundleId())
-                : name + " (" + Long.toString(bundle.getBundleId()) + ")";
-        }
-        return "[STALE BUNDLE]";
-    }
-
-}
diff --git a/karaf/shell/packages/src/main/java/org/apache/felix/karaf/shell/packages/ImportsCommand.java b/karaf/shell/packages/src/main/java/org/apache/felix/karaf/shell/packages/ImportsCommand.java
deleted file mode 100644
index ab423f3..0000000
--- a/karaf/shell/packages/src/main/java/org/apache/felix/karaf/shell/packages/ImportsCommand.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.felix.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;
-
-@Command(scope = "packages", name = "imports", description = "Display 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;
-
-    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 {
-            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, Bundle target, List<ExportedPackage> imports) {
-        if ((imports != null) && (imports.size() > 0)) {
-            for (ExportedPackage p : imports) {
-                Bundle bundle = p.getExportingBundle();
-                out.print(getBundleName(bundle));
-                out.println(": " + p);
-            }
-        } else {
-            out.println(getBundleName(target) + ": No active imported packages.");
-        }
-    }
-
-    public static String getBundleName(Bundle bundle) {
-        if (bundle != null) {
-            String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME);
-            return (name == null)
-                ? "Bundle " + Long.toString(bundle.getBundleId())
-                : name + " (" + Long.toString(bundle.getBundleId()) + ")";
-        }
-        return "[STALE BUNDLE]";
-    }
-
-}
diff --git a/karaf/shell/packages/src/main/java/org/apache/felix/karaf/shell/packages/PackageCommandSupport.java b/karaf/shell/packages/src/main/java/org/apache/felix/karaf/shell/packages/PackageCommandSupport.java
deleted file mode 100644
index 84ae132..0000000
--- a/karaf/shell/packages/src/main/java/org/apache/felix/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.felix.karaf.shell.packages;
-
-import org.apache.felix.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/shell/packages/src/main/resources/OSGI-INF/blueprint/shell-packages.xml b/karaf/shell/packages/src/main/resources/OSGI-INF/blueprint/shell-packages.xml
deleted file mode 100644
index 59f63ca..0000000
--- a/karaf/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">
-
-    <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="packages/exports">
-            <action class="org.apache.felix.karaf.shell.packages.ExportsCommand"/>
-        </command>
-        <command name="packages/imports">
-            <action class="org.apache.felix.karaf.shell.packages.ImportsCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/karaf/shell/pom.xml b/karaf/shell/pom.xml
deleted file mode 100644
index 3574434..0000000
--- a/karaf/shell/pom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>shell</artifactId>
-    <packaging>pom</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix 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>
-    </modules>
-
-</project>
diff --git a/karaf/shell/ssh/NOTICE b/karaf/shell/ssh/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/shell/ssh/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/shell/ssh/pom.xml b/karaf/shell/ssh/pom.xml
deleted file mode 100644
index a9d2a3d..0000000
--- a/karaf/shell/ssh/pom.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>org.apache.felix.karaf.shell.ssh</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Shell SSH</name>
-
-    <description>
-        Provides SSH support to the console
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.sshd</groupId>
-            <artifactId>sshd-core</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <resources>
-            <resource>
-                <directory>${project.basedir}/src/main/resources</directory>
-                <includes>
-                    <include>**/*</include>
-                </includes>
-            </resource>
-        </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>
-                            !${project.artifactId}*,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            org.apache.sshd.server.keyprovider,
-                            org.apache.sshd.server.jaas,
-                            *
-                        </Import-Package>
-                        <Private-Package>org.apache.felix.karaf.jpm.*</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/ShellCommandFactory.java b/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/ShellCommandFactory.java
deleted file mode 100644
index 4822347..0000000
--- a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/ShellCommandFactory.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.felix.karaf.shell.ssh;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-
-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.osgi.service.command.CommandProcessor;
-import org.osgi.service.command.CommandSession;
-
-public class ShellCommandFactory implements CommandFactory {
-
-    private CommandProcessor commandProcessor;
-
-    public void setCommandProcessor(CommandProcessor commandProcessor) {
-        this.commandProcessor = commandProcessor;
-    }
-
-    public Command createCommand(String command) {
-        return new ShellCommand(command);
-    }
-
-    public class ShellCommand implements Command {
-
-        private String command;
-        private InputStream in;
-        private OutputStream out;
-        private OutputStream err;
-        private ExitCallback callback;
-
-        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 start(final Environment env) throws IOException {
-            try {
-                CommandSession session = commandProcessor.createSession(in, new PrintStream(out), new PrintStream(err));
-                session.execute(command);
-            } catch (Exception e) {
-                throw (IOException) new IOException("Unable to start shell").initCause(e);
-            } finally {
-                close(in, out, err);
-                callback.onExit(0);
-            }
-        }
-
-        public void destroy() {
-		}
-
-    }
-
-    private static void close(Closeable... closeables) {
-        for (Closeable c : closeables) {
-            try {
-                c.close();
-            } catch (IOException e) {
-                // Ignore
-            }
-        }
-    }
-}
diff --git a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/ShellFactoryImpl.java b/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/ShellFactoryImpl.java
deleted file mode 100644
index 98cadda..0000000
--- a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/ShellFactoryImpl.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.felix.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.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.Callable;
-
-import jline.Terminal;
-import org.apache.felix.karaf.shell.console.Completer;
-import org.apache.felix.karaf.shell.console.completer.AggregateCompleter;
-import org.apache.felix.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.Signal;
-import org.apache.sshd.server.SignalListener;
-import org.osgi.service.blueprint.container.ReifiedType;
-import org.osgi.service.command.CommandProcessor;
-import org.osgi.service.command.CommandSession;
-
-/**
- * SSHD {@link org.apache.sshd.server.Command} factory which provides access to Shell.
- *
- * @version $Rev: 731517 $ $Date: 2009-01-05 11:25:19 +0100 (Mon, 05 Jan 2009) $
- */
-public class ShellFactoryImpl implements Factory<Command>
-{
-    private CommandProcessor commandProcessor;
-    private List<Completer> completers;
-
-    public void setCommandProcessor(CommandProcessor commandProcessor) {
-        this.commandProcessor = commandProcessor;
-    }
-
-    public void setCompleters(List<Completer> completers) {
-        this.completers = completers;
-    }
-
-    public Command create() {
-        return new ShellImpl();
-    }
-
-    public class ShellImpl implements Command
-    {
-        private InputStream in;
-
-        private OutputStream out;
-
-        private OutputStream err;
-
-        private ExitCallback callback;
-
-        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 start(final Environment env) throws IOException {
-            try {
-                final Terminal terminal = new SshTerminal(env);
-                Console console = new Console(commandProcessor,
-                                              in,
-                                              new PrintStream(new LfToCrLfFilterOutputStream(out), true),
-                                              new PrintStream(new LfToCrLfFilterOutputStream(err), true),
-                                              terminal,
-                                              new AggregateCompleter(completers),
-                                              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", Integer.toString(terminal.getTerminalHeight()));
-                session.put("COLUMNS", Integer.toString(terminal.getTerminalWidth()));
-                env.addSignalListener(new SignalListener() {
-                    public void signal(Signal signal) {
-                        session.put("LINES", Integer.toString(terminal.getTerminalHeight()));
-                        session.put("COLUMNS", Integer.toString(terminal.getTerminalWidth()));
-                    }
-                }, Signal.WINCH);
-                session.put(".jline.terminal", terminal);
-                new Thread(console).start();
-            } catch (Exception e) {
-                throw (IOException) new IOException("Unable to start shell").initCause(e);
-            }
-        }
-
-        public void destroy() {
-            if (!closed) {
-                closed = true;
-                ShellFactoryImpl.close(in, out, err);
-                callback.onExit(0);
-            }
-        }
-
-    }
-
-    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/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshAction.java b/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshAction.java
deleted file mode 100644
index 84f899d..0000000
--- a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshAction.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.felix.karaf.shell.ssh;
-
-import java.io.IOException;
-
-import org.apache.sshd.ClientChannel;
-import org.apache.sshd.ClientSession;
-import org.apache.sshd.SshClient;
-import org.apache.sshd.client.channel.ChannelShell;
-import org.apache.sshd.client.future.ConnectFuture;
-import org.apache.sshd.common.util.NoCloseInputStream;
-import org.apache.sshd.common.util.NoCloseOutputStream;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.karaf.shell.console.BlueprintContainerAware;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.osgi.service.blueprint.container.BlueprintContainer;
-
-/**
- * Connect to a SSH server.
- *
- * @version $Rev: 721244 $ $Date: 2008-11-27 18:19:56 +0100 (Thu, 27 Nov 2008) $
- */
-@Command(scope = "ssh", name = "ssh", description = "Connects to a remote SSH server")
-public class SshAction
-    extends OsgiCommandSupport implements BlueprintContainerAware
-{
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Option(name="-l", aliases={"--username"}, description = "The user name for remote login", required = false, multiValued = false)
-    private String username;
-
-    @Option(name="-P", aliases={"--password"}, description = "The password for remote login", required = false, multiValued = false)
-    private String password;
-
-    @Argument(index = 0, name = "hostname", description = "The host name to connect to via SSH", required = true, multiValued = false)
-    private String hostname;
-
-    @Option(name="-p", aliases={"--port"}, description = "The port to use for SSH connection", required = false, multiValued = false)
-    private int port = 22;
-
-    private BlueprintContainer container;
-
-	private ClientSession session;
-    private String sshClientId;
-
-    public void setBlueprintContainer(final BlueprintContainer container) {
-        assert container != null;
-        this.container = container;
-    }
-
-    public void setSshClientId(String sshClientId) {
-        this.sshClientId = sshClientId;
-    }
-
-    @Override
-    protected Object doExecute() throws Exception {
-
-        //
-        // TODO: Parse hostname for <username>@<hostname>
-        //
-
-        System.out.println("Connecting to host " + hostname + " on port " + port);
-
-        // If the username/password was not configured via cli, then prompt the user for the values
-        if (username == null || password == null) {
-            log.debug("Prompting user for credentials");
-            if (username == null) {
-                username = readLine("Login: ");
-            }
-            if (password == null) {
-                password = readLine("Password: ");
-            }
-        }
-
-        // Create the client from prototype
-        SshClient client = (SshClient) container.getComponentInstance(sshClientId);
-        log.debug("Created client: {}", client);
-        client.start();
-
-        try {
-            ConnectFuture future = client.connect(hostname, port);
-            future.await();
-            session = future.getSession();
-            try {
-                System.out.println("Connected");
-
-                session.authPassword(username, password);
-                int ret = session.waitFor(ClientSession.WAIT_AUTH | ClientSession.CLOSED | ClientSession.AUTHED, 0);
-                if ((ret & ClientSession.AUTHED) == 0) {
-                    System.err.println("Authentication failed");
-                    return null;
-                }
-
-                ClientChannel channel = session.createChannel("shell");
-                channel.setIn(new NoCloseInputStream(System.in));
-                ((ChannelShell) channel).setupSensibleDefaultPty();
-                channel.setOut(new NoCloseOutputStream(System.out));
-                channel.setErr(new NoCloseOutputStream(System.err));
-                channel.open();
-                channel.waitFor(ClientChannel.CLOSED, 0);
-            } finally {
-                session.close(false);
-            }
-        } finally {
-            client.stop();
-        }
-
-        return null;
-    }
-
-    public String readLine(String msg) throws IOException {
-        StringBuffer sb = new StringBuffer();
-        System.err.print(msg);
-        System.err.flush();
-        for (;;) {
-            int c = super.session.getKeyboard().read();
-            if (c < 0) {
-                return null;
-            }
-            System.err.print((char) c);
-            if (c == '\r' || c == '\n') {
-                break;
-            }
-            sb.append((char) c);
-        }
-        return sb.toString();
-    }
-
-}
diff --git a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshServerAction.java b/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshServerAction.java
deleted file mode 100644
index 4d02a6c..0000000
--- a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshServerAction.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.felix.karaf.shell.ssh;
-
-import org.apache.sshd.SshServer;
-import org.apache.felix.karaf.shell.console.BlueprintContainerAware;
-import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.gogo.commands.Command;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.osgi.service.blueprint.container.BlueprintContainer;
-
-/**
- * Start a SSH server.
- *
- * @version $Rev: 720411 $ $Date: 2008-11-25 05:32:43 +0100 (Tue, 25 Nov 2008) $
- */
-@Command(scope = "ssh", name = "sshd", description = "Creates a SSH server")
-public class SshServerAction extends OsgiCommandSupport implements BlueprintContainerAware
-{
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Option(name="-p", aliases={ "--port" }, description = "The port to setup the SSH server (Default: 8101)", required = false, multiValued = false)
-    private int port = 8101;
-
-    @Option(name="-b", aliases={ "--background"}, description = "The service will run in the background (Default: true)", required = false, multiValued = false)
-    private boolean background = true;
-
-    private BlueprintContainer container;
-
-    private String sshServerId;
-
-    public void setBlueprintContainer(final BlueprintContainer container) {
-        assert container != null;
-        this.container = container;
-    }
-
-    public void setSshServerId(String sshServerId) {
-        this.sshServerId = sshServerId;
-    }
-
-    protected Object doExecute() throws Exception {
-        SshServer server = (SshServer) container.getComponentInstance(sshServerId);
-
-        log.debug("Created server: {}", server);
-
-        server.setPort(port);
-
-        server.start();
-
-        System.out.println("SSH server listening on port " + port);
-
-        if (!background) {
-            synchronized (this) {
-                log.debug("Waiting for server to shutdown");
-
-                wait();
-            }
-
-            server.stop();
-        }
-
-        return null;
-    }
-}
diff --git a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshServerFactory.java b/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshServerFactory.java
deleted file mode 100644
index 150da1f..0000000
--- a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshServerFactory.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.felix.karaf.shell.ssh;
-
-import org.apache.sshd.SshServer;
-
-public class SshServerFactory {
-
-    private SshServer server;
-
-    private boolean start;
-
-    public SshServerFactory(SshServer server) {
-        this.server = server;
-    }
-
-    public boolean isStart() {
-        return start;
-    }
-
-    public void setStart(boolean start) {
-        this.start = start;
-    }
-
-    public void start() throws Exception {
-        if (start) {
-            try {
-                server.start();
-            } catch (Exception e) {
-                e.printStackTrace();
-                throw e;
-            }
-        }
-    }
-
-    public void stop() throws Exception {
-        if (start) {
-            server.stop();
-        }
-    }
-
-}
diff --git a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshTerminal.java b/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshTerminal.java
deleted file mode 100644
index b4fe699..0000000
--- a/karaf/shell/ssh/src/main/java/org/apache/felix/karaf/shell/ssh/SshTerminal.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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.karaf.shell.ssh;
-
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-import jline.Terminal;
-import org.apache.sshd.common.PtyMode;
-import org.apache.sshd.server.Environment;
-import org.apache.sshd.server.Signal;
-import org.apache.sshd.server.SignalListener;
-
-public class SshTerminal extends Terminal {
-
-    public static final short ARROW_START = 27;
-    public static final short ARROW_PREFIX = 91;
-    public static final short ARROW_LEFT = 68;
-    public static final short ARROW_RIGHT = 67;
-    public static final short ARROW_UP = 65;
-    public static final short ARROW_DOWN = 66;
-    public static final short O_PREFIX = 79;
-    public static final short HOME_CODE = 72;
-    public static final short END_CODE = 70;
-
-    public static final short DEL_THIRD = 51;
-    public static final short DEL_SECOND = 126;
-
-    private Environment environment;
-    private boolean backspaceDeleteSwitched = false;
-    private String encoding = System.getProperty("input.encoding", "UTF-8");
-    private ReplayPrefixOneCharInputStream replayStream = new ReplayPrefixOneCharInputStream(encoding);
-    private InputStreamReader replayReader;
-    private boolean isWindowsTerminal;
-
-    public SshTerminal(Environment environment) {
-        this.environment = environment;
-        try {
-            replayReader = new InputStreamReader(replayStream, encoding);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-        Integer verase = this.environment.getPtyModes().get(PtyMode.VERASE);
-        backspaceDeleteSwitched = verase != null && verase == DELETE;
-        this.isWindowsTerminal = "windows".equals(environment.getEnv().get("TERM"));
-    }
-
-    public void initializeTerminal() throws Exception {
-    }
-
-    public void restoreTerminal() throws Exception {
-    }
-
-    @Override
-    public boolean isANSISupported() {
-        return !isWindowsTerminal;
-    }
-
-    public int getTerminalWidth() {
-        return Integer.valueOf(this.environment.getEnv().get(Environment.ENV_COLUMNS));
-    }
-
-    public int getTerminalHeight() {
-        return Integer.valueOf(this.environment.getEnv().get(Environment.ENV_LINES));
-    }
-
-    public boolean isSupported() {
-        return true;
-    }
-
-    public boolean getEcho() {
-        return false;
-    }
-
-    public boolean isEchoEnabled() {
-        return false;
-    }
-
-    public void enableEcho() {
-    }
-
-    public void disableEcho() {
-    }
-
-    public int readVirtualKey(InputStream in) throws IOException {
-        int c = readCharacter(in);
-
-        if (backspaceDeleteSwitched)
-            if (c == DELETE)
-                c = BACKSPACE;
-            else if (c == BACKSPACE)
-                c = DELETE;
-
-        // in Unix terminals, arrow keys are represented by
-        // a sequence of 3 characters. E.g., the up arrow
-        // key yields 27, 91, 68
-        if (c == ARROW_START) {
-		//also the escape key is 27
-		//thats why we read until we
-		//have something different than 27
-		//this is a bugfix, because otherwise
-		//pressing escape and than an arrow key
-		//was an undefined state
-		while (c == ARROW_START)
-            		c = readCharacter(in);
-            if (c == ARROW_PREFIX || c == O_PREFIX) {
-                c = readCharacter(in);
-                if (c == ARROW_UP) {
-                    return CTRL_P;
-                } else if (c == ARROW_DOWN) {
-                    return CTRL_N;
-                } else if (c == ARROW_LEFT) {
-                    return CTRL_B;
-                } else if (c == ARROW_RIGHT) {
-                    return CTRL_F;
-                } else if (c == HOME_CODE) {
-                    return CTRL_A;
-                } else if (c == END_CODE) {
-                    return CTRL_E;
-                } else if (c == DEL_THIRD) {
-                    c = readCharacter(in); // read 4th
-                    return DELETE;
-                }
-            }
-        }
-        // handle unicode characters, thanks for a patch from amyi@inf.ed.ac.uk
-        if (c > 128) {
-          // handle unicode characters longer than 2 bytes,
-          // thanks to Marc.Herbert@continuent.com
-            replayStream.setInput(c, in);
-//            replayReader = new InputStreamReader(replayStream, encoding);
-            c = replayReader.read();
-
-        }
-
-        return c;
-    }
-
-    /**
-     * This is awkward and inefficient, but probably the minimal way to add
-     * UTF-8 support to JLine
-     *
-     * @author <a href="mailto:Marc.Herbert@continuent.com">Marc Herbert</a>
-     */
-    static class ReplayPrefixOneCharInputStream extends InputStream {
-        byte firstByte;
-        int byteLength;
-        InputStream wrappedStream;
-        int byteRead;
-
-        final String encoding;
-
-        public ReplayPrefixOneCharInputStream(String encoding) {
-            this.encoding = encoding;
-        }
-
-        public void setInput(int recorded, InputStream wrapped) throws IOException {
-            this.byteRead = 0;
-            this.firstByte = (byte) recorded;
-            this.wrappedStream = wrapped;
-
-            byteLength = 1;
-            if (encoding.equalsIgnoreCase("UTF-8"))
-                setInputUTF8(recorded, wrapped);
-            else if (encoding.equalsIgnoreCase("UTF-16"))
-                byteLength = 2;
-            else if (encoding.equalsIgnoreCase("UTF-32"))
-                byteLength = 4;
-        }
-
-
-        public void setInputUTF8(int recorded, InputStream wrapped) throws IOException {
-            // 110yyyyy 10zzzzzz
-            if ((firstByte & (byte) 0xE0) == (byte) 0xC0)
-                this.byteLength = 2;
-            // 1110xxxx 10yyyyyy 10zzzzzz
-            else if ((firstByte & (byte) 0xF0) == (byte) 0xE0)
-                this.byteLength = 3;
-            // 11110www 10xxxxxx 10yyyyyy 10zzzzzz
-            else if ((firstByte & (byte) 0xF8) == (byte) 0xF0)
-                this.byteLength = 4;
-            else
-                throw new IOException("invalid UTF-8 first byte: " + firstByte);
-        }
-
-        public int read() throws IOException {
-            if (available() == 0)
-                return -1;
-
-            byteRead++;
-
-            if (byteRead == 1)
-                return firstByte;
-
-            return wrappedStream.read();
-        }
-
-        /**
-        * InputStreamReader is greedy and will try to read bytes in advance. We
-        * do NOT want this to happen since we use a temporary/"losing bytes"
-        * InputStreamReader above, that's why we hide the real
-        * wrappedStream.available() here.
-        */
-        public int available() {
-            return byteLength - byteRead;
-        }
-    }
-    
-}
diff --git a/karaf/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml b/karaf/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
deleted file mode 100644
index 3f6edbc..0000000
--- a/karaf/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
+++ /dev/null
@@ -1,110 +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.0.0"
-           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
-           default-activation="lazy">
-
-    <type-converters>
-        <bean class="org.apache.felix.karaf.shell.ssh.ShellFactoryImpl" factory-method="getConverter" />
-    </type-converters>
-
-    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]"/>
-
-    <cm:property-placeholder persistent-id="org.apache.felix.karaf.shell">
-        <cm:default-properties>
-            <cm:property name="sshPort" value="8101"/>
-            <cm:property name="sshHost" value="0.0.0.0"/>
-            <cm:property name="sshRealm" value="karaf"/>
-            <cm:property name="hostKey" value="${karaf.base}/etc/host.key"/>
-        </cm:default-properties>
-    </cm:property-placeholder>
-
-    <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="ssh/ssh">
-            <action class="org.apache.felix.karaf.shell.ssh.SshAction">
-                <property name="sshClientId">
-                    <bp:idref component-id="sshClient"/>
-                </property>
-            </action>
-        </command>
-        <command name="ssh/sshd">
-            <action class="org.apache.felix.karaf.shell.ssh.SshServerAction">
-                <property name="sshServerId">
-                    <bp:idref component-id="sshServer"/>
-                </property>
-            </action>
-        </command>
-    </command-bundle>
-
-    <bean id="sshClient" class="org.apache.sshd.SshClient" factory-method="setUpDefaultClient" scope="prototype">
-    </bean>
-
-    <bean id="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.felix.karaf.shell.ssh.ShellFactoryImpl">
-                <property name="completers">
-                    <list>
-                        <ref component-id="commandCompleter"/>
-                    </list>
-                </property>
-                <property name="commandProcessor" ref="commandProcessor"/>
-            </bean>
-        </property>
-        <property name="commandFactory">
-            <bean class="org.apache.felix.karaf.shell.ssh.ShellCommandFactory">
-                <property name="commandProcessor" ref="commandProcessor"/>
-            </bean>
-        </property>
-        <property name="keyPairProvider" ref="keyPairProvider"/>
-        <property name="passwordAuthenticator" ref="passwordAuthenticator"/>
-    </bean>
-
-    <bean id="keyPairProvider" class="org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider">
-        <property name="path" value="${hostKey}"/>
-    </bean>
-    <bean id="passwordAuthenticator" class="org.apache.sshd.server.jaas.JaasPasswordAuthenticator">
-        <property name="domain" value="${sshRealm}"/>
-    </bean>
-
-    <bean id="sshServerFactory" class="org.apache.felix.karaf.shell.ssh.SshServerFactory" init-method="start"
-          destroy-method="stop" activation="eager">
-        <argument ref="sshServer"/>
-        <property name="start" value="$[karaf.startRemoteShell]"/>
-    </bean>
-
-    <reference id="commandProcessor" interface="org.osgi.service.command.CommandProcessor">
-    </reference>
-
-    <reference-list id="functions" filter="(&amp;(osgi.command.scope=*)(osgi.command.function=*))"
-                    availability="optional" activation="eager">
-        <reference-listener ref="commandCompleter"
-                            bind-method="register"
-                            unbind-method="unregister"/>
-    </reference-list>
-
-    <bean id="commandCompleter" class="org.apache.felix.karaf.shell.console.completer.CommandsCompleter">
-        <property name="bundleContext" ref="blueprintBundleContext" />
-    </bean>
-
-</blueprint>
diff --git a/karaf/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.properties
deleted file mode 100644
index 52263f1..0000000
--- a/karaf/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.properties
+++ /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.
-#
-
-#
-# This file contains localization strings for configuration labels and
-# descriptions as used in the metatype.xml descriptor
-
-shell.name = Apache Felix Karaf Shell
-shell.description = Configuration of Apache Felix Karaf Shell
-
-sshPort.name = SSH Port
-sshPort.description = port of the SSH daemon
-
-sshHost.name = SSH Host
-sshHost.description = name of the host used to bind the SSH daemon
-
-sshRealm.name = SSH Realm
-sshRealm.description = name of the JAAS realm to use for SSH authentication
-
-hostKey.name = Host key
-hostKey.description = location of the host key for SSH
diff --git a/karaf/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.xml
deleted file mode 100644
index 8350f10..0000000
--- a/karaf/shell/ssh/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.felix.karaf.shell" name="%shell.name" description="%shell.description">
-        <AD id="sshPort" type="Integer" default="8101" name="%sshPort.name" description="%sshPort.description"/>
-        <AD id="sshHost" type="String" default="0.0.0.0" name="%sshHost.name" description="%sshHost.description"/>
-        <AD id="sshRealm" type="String" default="karaf" name="%sshRealm.name" description="%sshRealm.description"/>
-        <AD id="hostKey" type="String" default="${karaf.base}/etc/host.key" name="%hostKey.name" description="%hostKey.description"/>
-    </OCD>
-    <Designate pid="org.apache.felix.karaf.shell">
-        <Object ocdref="org.apache.felix.karaf.shell"/>
-    </Designate>
-</metatype:MetaData>
diff --git a/karaf/shell/wrapper/NOTICE b/karaf/shell/wrapper/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/shell/wrapper/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/shell/wrapper/pom.xml b/karaf/shell/wrapper/pom.xml
deleted file mode 100644
index 5051da7..0000000
--- a/karaf/shell/wrapper/pom.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>org.apache.felix.karaf.shell.wrapper</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Shell Service Wrapper</name>
-
-    <description>
-        Provides the Service Wrapper Shell integration
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</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/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>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Export-Package>${project.artifactId}*;version=${project.version}</Export-Package>
-                        <Import-Package>
-                            !${project.artifactId}*,
-                            org.osgi.service.command,
-                            org.apache.felix.gogo.commands,
-                            org.apache.felix.karaf.shell.console,
-                            *
-                        </Import-Package>
-                        <Private-Package>!*</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf/shell/wrapper/src/main/java/org/apache/felix/karaf/shell/wrapper/InstallCommand.java b/karaf/shell/wrapper/src/main/java/org/apache/felix/karaf/shell/wrapper/InstallCommand.java
deleted file mode 100644
index 2aeeb5d..0000000
--- a/karaf/shell/wrapper/src/main/java/org/apache/felix/karaf/shell/wrapper/InstallCommand.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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 org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.gogo.commands.Command;
-import org.fusesource.jansi.Ansi;
-
-/**
- * Installs this Karaf instance as a service in your operating systems.
- *
- * @version $Rev: 603634 $ $Date: 2007-12-12 16:07:16 +0100 (Wed, 12 Dec 2007) $
- */
-@Command(scope = "wrapper", name = "install", description = "Install the container as a system service in the OS.")
-public class InstallCommand extends OsgiCommandSupport
-{
-    @Option(name="-n", aliases={"--name"}, description="The service name that will be used when installing the service. (Default: karaf)", required = false, multiValued = false)
-    private String name="karaf";
-
-    @Option(name="-d", aliases={"--display"}, description="The display name of the service.", required = false, multiValued = false)
-    private String displayName;
-
-    @Option(name="-D", aliases={"--description"}, description="The description of the service.", required = false, multiValued = false)
-    private String description="";
-
-    @Option(name="-s", aliases={"--start-type"}, description="Mode in which the service is installed. AUTO_START or DEMAND_START (Default: AUTO_START)", required = false, multiValued = false)
-    private String startType="AUTO_START";
-
-    protected Object doExecute() throws Exception {
-    	
-    	try {
-    		String name = getName();    		
-    		File base = new File(System.getProperty("karaf.base"));
-    		File bin = new File(base, "bin");
-    		File etc = new File(base, "etc");
-    		File lib = new File(base, "lib");
-    		
-			HashMap<String, String> props = new HashMap<String, String>();
-			props.put("${karaf.home}", System.getProperty("karaf.home"));
-			props.put("${karaf.base}", base.getPath());
-			props.put("${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") ) {
-				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") ) {
-				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 {
-		        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);
-
-			System.out.println("");
-			System.out.println("Setup complete.  You may want 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 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 want it re-created: ").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 want it re-created: ").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/shell/wrapper/src/main/java/org/apache/felix/karaf/shell/wrapper/PumpStreamHandler.java b/karaf/shell/wrapper/src/main/java/org/apache/felix/karaf/shell/wrapper/PumpStreamHandler.java
deleted file mode 100644
index 3809bed..0000000
--- a/karaf/shell/wrapper/src/main/java/org/apache/felix/karaf/shell/wrapper/PumpStreamHandler.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.felix.karaf.shell.wrapper;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-//
-// Based on Apache Ant 1.6.5
-//
-
-/**
- * Copies standard output and error of children streams to standard output and error of the parent.
- *
- * @version $Rev: 705608 $ $Date: 2008-10-17 15:28:45 +0200 (Fri, 17 Oct 2008) $
- */
-public class PumpStreamHandler
-{
-    private InputStream in;
-
-    private OutputStream out;
-
-    private OutputStream err;
-
-    private Thread outputThread;
-
-    private Thread errorThread;
-
-    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) {
-        assert in != null;
-        assert out != null;
-        assert err != null;
-
-        this.in = in;
-        this.out = out;
-        this.err = err;
-    }
-
-    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 (outputThread != null) {
-            outputThread.start();
-        }
-
-        if (errorThread != null) {
-            errorThread.start();
-        }
-
-        if (inputPump != null) {
-            Thread inputThread = new Thread(inputPump);
-            inputThread.setDaemon(true);
-            inputThread.start();
-        }
-    }
-
-    /**
-     * Stop pumping the streams.
-     */
-    public void stop() {
-        if (outputThread != null) {
-            try {
-                outputThread.join();
-            }
-            catch (InterruptedException e) {
-                // ignore
-            }
-        }
-
-        if (errorThread != null) {
-            try {
-                errorThread.join();
-            }
-            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;
-
-        outputThread = 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;
-
-        errorThread = createPump(in, out);
-    }
-
-    /**
-     * Creates a stream pumper to copy the given input stream to the given output stream.
-     */
-    protected Thread 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 Thread createPump(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
-        assert in != null;
-        assert out != null;
-
-        final Thread result = new Thread(new StreamPumper(in, out, closeWhenExhausted));
-        result.setDaemon(true);
-        return result;
-    }
-
-    /**
-     * 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;
-    }
-}
\ No newline at end of file
diff --git a/karaf/shell/wrapper/src/main/java/org/apache/felix/karaf/shell/wrapper/StreamPumper.java b/karaf/shell/wrapper/src/main/java/org/apache/felix/karaf/shell/wrapper/StreamPumper.java
deleted file mode 100644
index 8c2e689..0000000
--- a/karaf/shell/wrapper/src/main/java/org/apache/felix/karaf/shell/wrapper/StreamPumper.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.felix.karaf.shell.wrapper;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-//
-// Based on Apache Ant 1.6.5
-//
-
-/**
- * Copies all data from an input stream to an output stream.
- *
- * @version $Rev: 705608 $ $Date: 2008-10-17 15:28:45 +0200 (Fri, 17 Oct 2008) $
- */
-public class StreamPumper
-    implements Runnable
-{
-    private InputStream in;
-
-    private OutputStream out;
-
-    private volatile boolean finish;
-
-    private volatile boolean finished;
-
-    private boolean closeWhenExhausted;
-
-    private boolean autoflush;
-
-    private Exception exception;
-
-    private int bufferSize = 128;
-
-    private boolean started;
-
-    /**
-     * Create a new stream pumper.
-     *
-     * @param in                    Input stream to read data from
-     * @param out                   Output stream to write data to.
-     * @param closeWhenExhausted    If true, the output stream will be closed when
-     *                              the input is exhausted.
-     */
-    public StreamPumper(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
-        assert in != null;
-        assert out != null;
-
-        this.in = in;
-        this.out = out;
-        this.closeWhenExhausted = closeWhenExhausted;
-    }
-
-    /**
-     * Create a new stream pumper.
-     *
-     * @param in    Input stream to read data from
-     * @param out   Output stream to write data to.
-     */
-    public StreamPumper(final InputStream in, final OutputStream out) {
-        this(in, out, false);
-    }
-
-    /**
-     * Set whether data should be flushed through to the output stream.
-     *
-     * @param autoflush     If true, push through data; if false, let it be buffered
-     */
-    public void setAutoflush(boolean autoflush) {
-        this.autoflush = autoflush;
-    }
-
-    /**
-     * Copies data from the input stream to the output stream.
-     *
-     * Terminates as soon as the input stream is closed or an error occurs.
-     */
-    public void run() {
-        synchronized (this) {
-            started = true;
-        }
-        finished = false;
-        finish = false;
-
-        final byte[] buf = new byte[bufferSize];
-
-        int length;
-        try {
-            while ((length = in.read(buf)) > 0 && !finish) {
-                out.write(buf, 0, length);
-                if (autoflush) {
-                    out.flush();
-                }
-            }
-            out.flush();
-        }
-        catch (Exception e) {
-            synchronized (this) {
-                exception = e;
-            }
-        }
-        finally {
-            if (closeWhenExhausted) {
-                try {
-                    out.close();
-                } catch (IOException e) { }
-            }
-            finished = true;
-
-            synchronized (this) {
-                notifyAll();
-            }
-        }
-    }
-
-    /**
-     * Tells whether the end of the stream has been reached.
-     *
-     * @return true     If the stream has been exhausted.
-     */
-    public boolean isFinished() {
-        return finished;
-    }
-
-    /**
-     * This method blocks until the stream pumper finishes.
-     *
-     * @see #isFinished()
-     */
-    public synchronized void waitFor() throws InterruptedException {
-        while (!isFinished()) {
-            wait();
-        }
-    }
-
-    /**
-     * Set the size in bytes of the read buffer.
-     *
-     * @param bufferSize the buffer size to use.
-     * @throws IllegalStateException if the StreamPumper is already running.
-     */
-    public synchronized void setBufferSize(final int bufferSize) {
-        if (started) {
-            throw new IllegalStateException("Cannot set buffer size on a running StreamPumper");
-        }
-
-        this.bufferSize = bufferSize;
-    }
-
-    /**
-     * Get the size in bytes of the read buffer.
-     *
-     * @return The size of the read buffer.
-     */
-    public synchronized int getBufferSize() {
-        return bufferSize;
-    }
-
-    /**
-     * Get the exception encountered, if any.
-     *
-     * @return The Exception encountered; or null if there was none.
-     */
-    public synchronized Exception getException() {
-        return exception;
-    }
-
-    /**
-     * Stop the pumper as soon as possible.
-     *
-     * Note that it may continue to block on the input stream
-     * but it will really stop the thread as soon as it gets EOF
-     * or any byte, and it will be marked as finished.
-     */
-    public synchronized void stop() {
-        finish = true;
-
-        notifyAll();
-    }
-}
\ No newline at end of file
diff --git a/karaf/shell/wrapper/src/main/resources/OSGI-INF/blueprint/shell-wrapper.xml b/karaf/shell/wrapper/src/main/resources/OSGI-INF/blueprint/shell-wrapper.xml
deleted file mode 100644
index 522663b..0000000
--- a/karaf/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">
-
-    <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/shell/v1.0.0">
-        <command name="wrapper/install">
-            <action class="org.apache.felix.karaf.shell.wrapper.InstallCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/all/karaf-wrapper.jar b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/all/karaf-wrapper.jar
deleted file mode 100755
index c766405..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/all/karaf-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/linux/karaf-wrapper b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/linux/karaf-wrapper
deleted file mode 100644
index c58d4f7..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/linux/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/linux/libwrapper.so b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/linux/libwrapper.so
deleted file mode 100644
index df25ec6..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/linux/libwrapper.so
+++ /dev/null
Binary files differ
diff --git a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/macosx/karaf-wrapper b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/macosx/karaf-wrapper
deleted file mode 100644
index 8c281b9..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/macosx/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/macosx/libwrapper.jnilib b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/macosx/libwrapper.jnilib
deleted file mode 100644
index ae5a14e..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/macosx/libwrapper.jnilib
+++ /dev/null
Binary files differ
diff --git a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/unix/karaf-service b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/unix/karaf-service
deleted file mode 100755
index 4fbfbe8..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/unix/karaf-service
+++ /dev/null
@@ -1,543 +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.
-# ------------------------------------------------------------------------
-
-# 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 pid file.
-PIDDIR="${karaf.base}/data"
-
-# If uncommented, causes the Wrapper to be shutdown using an anchor file.
-#  When launched with the 'start' command, it will also ignore all INT and
-#  TERM signals.
-#IGNORE_SIGNALS=true
-
-# If specified, the Wrapper will be run as the specified user.
-# IMPORTANT - Make sure that the user has the required privileges to write
-#  the PID file and wrapper.log files.  Failure to be able to write the log
-#  file will cause the Wrapper to exit without any way to write out an error
-#  message.
-# NOTE - This will set the user which is used to run the Wrapper as well as
-#  the JVM and is not useful in situations where a privileged resource or
-#  port needs to be allocated prior to the user being changed.
-#RUN_AS_USER=
-
-# The following two lines are used by the chkconfig command. Change as is
-#  appropriate for your application.  They should remain commented.
-# chkconfig: 2345 20 80
-# description: ${displayName}
-
-# Do not modify anything beyond this point
-#-----------------------------------------------------------------------------
-
-# Get the fully qualified path to the script
-case $0 in
-    /*)
-        SCRIPT="$0"
-        ;;
-    *)
-        PWD=`pwd`
-        SCRIPT="$PWD/$0"
-        ;;
-esac
-
-# Resolve the true real path without any sym links.
-CHANGED=true
-while [ "X$CHANGED" != "X" ]
-do
-    # Change spaces to ":" so the tokens can be parsed.
-    SCRIPT=`echo $SCRIPT | sed -e 's; ;:;g'`
-    # Get the real path to this script, resolving any symbolic links
-    TOKENS=`echo $SCRIPT | sed -e 's;/; ;g'`
-    REALPATH=
-    for C in $TOKENS; do
-        REALPATH="$REALPATH/$C"
-        while [ -h "$REALPATH" ] ; do
-            LS="`ls -ld "$REALPATH"`"
-            LINK="`expr "$LS" : '.*-> \(.*\)$'`"
-            if expr "$LINK" : '/.*' > /dev/null; then
-                REALPATH="$LINK"
-            else
-                REALPATH="`dirname "$REALPATH"`""/$LINK"
-            fi
-        done
-    done
-    # Change ":" chars back to spaces.
-    REALPATH=`echo $REALPATH | sed -e 's;:; ;g'`
-
-    if [ "$REALPATH" = "$SCRIPT" ]
-    then
-        CHANGED=""
-    else
-        SCRIPT="$REALPATH"
-    fi
-done
-
-# Change the current directory to the location of the script
-cd "`dirname "$REALPATH"`"
-REALDIR=`pwd`
-
-# If the PIDDIR is relative, set its value relative to the full REALPATH to avoid problems if
-#  the working directory is later changed.
-FIRST_CHAR=`echo $PIDDIR | cut -c1,1`
-if [ "$FIRST_CHAR" != "/" ]
-then
-    PIDDIR=$REALDIR/$PIDDIR
-fi
-# Same test for WRAPPER_CMD
-FIRST_CHAR=`echo $WRAPPER_CMD | cut -c1,1`
-if [ "$FIRST_CHAR" != "/" ]
-then
-    WRAPPER_CMD=$REALDIR/$WRAPPER_CMD
-fi
-# Same test for WRAPPER_CONF
-FIRST_CHAR=`echo $WRAPPER_CONF | cut -c1,1`
-if [ "$FIRST_CHAR" != "/" ]
-then
-    WRAPPER_CONF=$REALDIR/$WRAPPER_CONF
-fi
-
-# Process ID
-ANCHORFILE="$PIDDIR/$APP_NAME.anchor"
-PIDFILE="$PIDDIR/$APP_NAME.pid"
-LOCKDIR="/var/lock/subsys"
-LOCKFILE="$LOCKDIR/$APP_NAME"
-pid=""
-
-# Resolve the location of the 'ps' command
-PSEXE="/usr/bin/ps"
-if [ ! -x $PSEXE ]
-then
-    PSEXE="/bin/ps"
-    if [ ! -x $PSEXE ]
-    then
-        echo "Unable to locate 'ps'."
-        echo "Please report this message along with the location of the command on your system."
-        exit 1
-    fi
-fi
-
-# Resolve the os
-DIST_OS=`uname -s | tr [:upper:] [:lower:] | tr -d [:blank:]`
-case "$DIST_OS" in
-    'sunos')
-        DIST_OS="solaris"
-        ;;
-    'hp-ux' | 'hp-ux64')
-        DIST_OS="hpux"
-        ;;
-    'darwin')
-        DIST_OS="macosx"
-        ;;
-    'unix_sv')
-        DIST_OS="unixware"
-        ;;
-esac
-
-# Resolve the architecture
-DIST_ARCH=`uname -p | tr [:upper:] [:lower:] | tr -d [:blank:]`
-if [ "$DIST_ARCH" = "unknown" ]
-then
-    DIST_ARCH=`uname -m | tr [:upper:] [:lower:] | tr -d [:blank:]`
-fi
-case "$DIST_ARCH" in
-    'amd64' | 'ia32' | 'ia64' | 'i386' | 'i486' | 'i586' | 'i686' | 'x86_64')
-        DIST_ARCH="x86"
-        ;;
-    'ip27')
-        DIST_ARCH="mips"
-        ;;
-    'power' | 'powerpc' | 'power_pc' | 'ppc64')
-        DIST_ARCH="ppc"
-        ;;
-    'pa_risc' | 'pa-risc')
-        DIST_ARCH="parisc"
-        ;;
-    'sun4u' | 'sparcv9')
-        DIST_ARCH="sparc"
-        ;;
-    '9000/800')
-        DIST_ARCH="parisc"
-        ;;
-esac
-
-# Decide on the wrapper binary to use.
-# If a 32-bit wrapper binary exists then it will work on 32 or 64 bit
-#  platforms, if the 64-bit binary exists then the distribution most
-#  likely wants to use long names.  Otherwise, look for the default.
-# For macosx, we also want to look for universal binaries.
-WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32"
-if [ -x $WRAPPER_TEST_CMD ]
-then
-    WRAPPER_CMD="$WRAPPER_TEST_CMD"
-else
-    if [ "$DIST_OS" = "macosx" ]
-    then
-        WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-universal-32"
-        if [ -x $WRAPPER_TEST_CMD ]
-        then
-            WRAPPER_CMD="$WRAPPER_TEST_CMD"
-        else
-            WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-64"
-            if [ -x $WRAPPER_TEST_CMD ]
-            then
-                WRAPPER_CMD="$WRAPPER_TEST_CMD"
-            else
-                WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-universal-64"
-                if [ -x $WRAPPER_TEST_CMD ]
-                then
-                    WRAPPER_CMD="$WRAPPER_TEST_CMD"
-                else
-                    if [ ! -x $WRAPPER_CMD ]
-                    then
-                        echo "Unable to locate any of the following binaries:"
-                        echo "  $WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32"
-                        echo "  $WRAPPER_CMD-$DIST_OS-universal-32"
-                        echo "  $WRAPPER_CMD-$DIST_OS-$DIST_ARCH-64"
-                        echo "  $WRAPPER_CMD-$DIST_OS-universal-64"
-                        echo "  $WRAPPER_CMD"
-                        exit 1
-                    fi
-                fi
-            fi
-        fi
-    else
-        WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-64"
-        if [ -x $WRAPPER_TEST_CMD ]
-        then
-            WRAPPER_CMD="$WRAPPER_TEST_CMD"
-        else
-            if [ ! -x $WRAPPER_CMD ]
-            then
-                echo "Unable to locate any of the following binaries:"
-                echo "  $WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32"
-                echo "  $WRAPPER_CMD-$DIST_OS-$DIST_ARCH-64"
-                echo "  $WRAPPER_CMD"
-                exit 1
-            fi
-        fi
-    fi
-fi
-
-# Build the nice clause
-if [ "X$PRIORITY" = "X" ]
-then
-    CMDNICE=""
-else
-    CMDNICE="nice -$PRIORITY"
-fi
-
-# Build the anchor file clause.
-if [ "X$IGNORE_SIGNALS" = "X" ]
-then
-   ANCHORPROP=
-   IGNOREPROP=
-else
-   ANCHORPROP=wrapper.anchorfile=$ANCHORFILE
-   IGNOREPROP=wrapper.ignore_signals=TRUE
-fi
-
-# Build the lock file clause.  Only create a lock file if the lock directory exists on this platform.
-if [ -d $LOCKDIR ]
-then
-    LOCKPROP=wrapper.lockfile=$LOCKFILE
-else
-    LOCKPROP=
-fi
-
-checkUser() {
-    # Check the configured user.  If necessary rerun this script as the desired user.
-    if [ "X$RUN_AS_USER" != "X" ]
-    then
-        # Resolve the location of the 'id' command
-        IDEXE="/usr/xpg4/bin/id"
-        if [ ! -x $IDEXE ]
-        then
-            IDEXE="/usr/bin/id"
-            if [ ! -x $IDEXE ]
-            then
-                echo "Unable to locate 'id'."
-                echo "Please report this message along with the location of the command on your system."
-                exit 1
-            fi
-        fi
-
-        if [ "`$IDEXE -u -n`" = "$RUN_AS_USER" ]
-        then
-            # Already running as the configured user.  Avoid password prompts by not calling su.
-            RUN_AS_USER=""
-        fi
-    fi
-    if [ "X$RUN_AS_USER" != "X" ]
-    then
-        # If LOCKPROP and $RUN_AS_USER are defined then the new user will most likely not be
-        # able to create the lock file.  The Wrapper will be able to update this file once it
-        # is created but will not be able to delete it on shutdown.  If $2 is defined then
-        # the lock file should be created for the current command
-        if [ "X$LOCKPROP" != "X" ]
-        then
-            if [ "X$2" != "X" ]
-            then
-                # Resolve the primary group
-                RUN_AS_GROUP=`groups $RUN_AS_USER | awk '{print $3}' | tail -1`
-                if [ "X$RUN_AS_GROUP" = "X" ]
-                then
-                    RUN_AS_GROUP=RUN_AS_USER
-                fi
-                touch $LOCKFILE
-                chown $RUN_AS_USER:$RUN_AS_GROUP $LOCKFILE
-            fi
-        fi
-
-        # Still want to change users, recurse.  This means that the user will only be
-        #  prompted for a password once.
-        su -m $RUN_AS_USER -c "$REALPATH $1"
-
-        # Now that we are the original user again, we may need to clean up the lock file.
-        if [ "X$LOCKPROP" != "X" ]
-        then
-            getpid
-            if [ "X$pid" = "X" ]
-            then
-                # Wrapper is not running so make sure the lock file is deleted.
-                if [ -f $LOCKFILE ]
-                then
-                    rm $LOCKFILE
-                fi
-            fi
-        fi
-
-        exit 0
-    fi
-}
-
-getpid() {
-    if [ -f $PIDFILE ]
-    then
-        if [ -r $PIDFILE ]
-        then
-            pid=`cat $PIDFILE`
-            if [ "X$pid" != "X" ]
-            then
-                # It is possible that 'a' process with the pid exists but that it is not the
-                #  correct process.  This can happen in a number of cases, but the most
-                #  common is during system startup after an unclean shutdown.
-                # The ps statement below looks for the specific wrapper command running as
-                #  the pid.  If it is not found then the pid file is considered to be stale.
-                pidtest=`$PSEXE -p $pid -o command | grep $WRAPPER_CMD | tail -1`
-                if [ "X$pidtest" = "X" ]
-                then
-                    # This is a stale pid file.
-                    rm -f $PIDFILE
-                    echo "Removed stale pid file: $PIDFILE"
-                    pid=""
-                fi
-            fi
-        else
-            echo "Cannot read $PIDFILE."
-            exit 1
-        fi
-    fi
-}
-
-testpid() {
-    pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1`
-    if [ "X$pid" = "X" ]
-    then
-        # Process is gone so remove the pid file.
-        rm -f $PIDFILE
-        pid=""
-    fi
-}
-
-console() {
-    echo "Running $APP_LONG_NAME..."
-    getpid
-    if [ "X$pid" = "X" ]
-    then
-        COMMAND_LINE="$CMDNICE $WRAPPER_CMD $WRAPPER_CONF wrapper.syslog.ident=$APP_NAME wrapper.pidfile=$PIDFILE $ANCHORPROP $LOCKPROP"
-        exec $COMMAND_LINE
-    else
-        echo "$APP_LONG_NAME is already running."
-        exit 1
-    fi
-}
-
-start() {
-    echo "Starting $APP_LONG_NAME..."
-    getpid
-    if [ "X$pid" = "X" ]
-    then
-        if [ ! -d ../../data ]; then
-            mkdir ../../data
-        fi
-        if [ ! -d ../../data/log ]; then
-            mkdir ../../data/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/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/unix/karaf-wrapper.conf b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/unix/karaf-wrapper.conf
deleted file mode 100644
index 2ef29cb..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/unix/karaf-wrapper.conf
+++ /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.
-# ------------------------------------------------------------------------
-
-#********************************************************************
-# Wrapper Properties
-#********************************************************************
-set.default.KARAF_HOME=${karaf.home}
-set.default.KARAF_BASE=${karaf.base}
-
-# Java Application
-wrapper.working.dir=%KARAF_BASE%
-wrapper.java.command=java
-wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
-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.library.path.1=%KARAF_BASE%/lib/
-
-# Application Parameters.  Add parameters as needed starting from 1
-wrapper.app.parameter.1=org.apache.felix.karaf.main.Bootstrap
-
-# 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=-Dcom.sun.management.jmxremote
-wrapper.java.additional.4=-Dkaraf.startLocalConsole=false
-wrapper.java.additional.5=-Dkaraf.startRemoteShell=true
-wrapper.java.additional.6=-Djava.endorsed.dirs="%JAVA_HOME%/jre/lib/endorsed;%JAVA_HOME%/lib/endorsed;%KARAF_HOME%/lib/endorsed"
-wrapper.java.additional.7=-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_BASE%/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/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/karaf-service.bat b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/karaf-service.bat
deleted file mode 100644
index f29dccd..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/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/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/karaf-wrapper.conf b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/karaf-wrapper.conf
deleted file mode 100644
index 196beff..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/karaf-wrapper.conf
+++ /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.
-# ------------------------------------------------------------------------
-
-#********************************************************************
-# Wrapper Properties
-#********************************************************************
-set.default.KARAF_HOME=${karaf.home}
-set.default.KARAF_BASE=${karaf.base}
-
-# Java Application
-wrapper.working.dir=%KARAF_BASE%
-wrapper.java.command=java
-wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
-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.library.path.1=%KARAF_BASE%/lib/
-
-# Application Parameters.  Add parameters as needed starting from 1
-wrapper.app.parameter.1=org.apache.felix.karaf.main.Bootstrap
-
-# 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=-Dcom.sun.management.jmxremote
-wrapper.java.additional.4=-Dkaraf.startLocalConsole=false
-wrapper.java.additional.5=-Dkaraf.startRemoteShell=true
-wrapper.java.additional.6=-Djava.endorsed.dirs="%JAVA_HOME%/jre/lib/endorsed;%JAVA_HOME%/lib/endorsed;%KARAF_HOME%/lib/endorsed"
-wrapper.java.additional.7=-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_BASE%/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/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/karaf-wrapper.exe b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/karaf-wrapper.exe
deleted file mode 100644
index a46a2ac..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/karaf-wrapper.exe
+++ /dev/null
Binary files differ
diff --git a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/wrapper.dll b/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/wrapper.dll
deleted file mode 100644
index 37c4f33..0000000
--- a/karaf/shell/wrapper/src/main/resources/org/apache/felix/karaf/shell/wrapper/windows/wrapper.dll
+++ /dev/null
Binary files differ
diff --git a/karaf/tooling/cmdhelp-maven-plugin/pom.xml b/karaf/tooling/cmdhelp-maven-plugin/pom.xml
deleted file mode 100644
index 4edc4a1..0000000
--- a/karaf/tooling/cmdhelp-maven-plugin/pom.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-      <groupId>org.apache.felix.karaf.tooling</groupId>
-      <artifactId>tooling</artifactId>
-      <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.tooling</groupId>
-    <artifactId>cmdhelp-maven-plugin</artifactId>
-    <packaging>maven-plugin</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: 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.felix.karaf.shell</groupId>
-        <artifactId>org.apache.felix.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/tooling/cmdhelp-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/cmdhelp/CmdHelpMojo.java b/karaf/tooling/cmdhelp-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/cmdhelp/CmdHelpMojo.java
deleted file mode 100644
index fe634a3..0000000
--- a/karaf/tooling/cmdhelp-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/cmdhelp/CmdHelpMojo.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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.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.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.osgi.service.command.CommandSession;
-
-/**
- * Generates docbook for Karaf commands
- *
- * @version $Revision: 1.1 $
- * @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;
-
-    public void execute() throws MojoExecutionException, MojoFailureException {
-        try {
-            if (!targetFolder.exists()) {
-                targetFolder.mkdirs();
-            }
-            
-            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());
-            ClassFinder finder = new ClassFinder(loader, urls);
-            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();
-                    Command cmd = (Command) clazz.getAnnotation(Command.class);
-                    File output = new File(targetFolder, cmd.scope() + "-" + cmd.name() + ".xml");
-                    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);
-                }
-            }
-
-            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();
-
-        } 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() 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);
-                new Preparator().prepare(action, session, Collections.<Object>singletonList("--help"));
-                newout.close();
-                baos.close();
-                return baos.toString();
-            } finally {
-                System.setOut(oldout);
-            }
-        }
-
-        protected class Preparator extends BlueprintActionPreparator {
-
-            @Override
-            protected void printUsage(CommandSession session, Command command, Set<Option> options, Set<Argument> args, PrintStream out)
-            {
-                List<Argument> arguments = new ArrayList<Argument>(args);
-                Collections.sort(arguments, new Comparator<Argument>() {
-                    public int compare(Argument o1, Argument o2) {
-                        return Integer.valueOf(o1.index()).compareTo(Integer.valueOf(o2.index()));
-                    }
-                });
-                options = new HashSet<Option>(options);
-                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>");
-                        out.println("      <td>" + argument.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();
-                        for (String alias : option.aliases())
-                        {
-                            opt += ", " + alias;
-                        }
-                        out.println("    <tr>");
-                        out.println("      <td>" + opt + "</td>");
-                        out.println("      <td>" + option.description() + "</td>");
-                        out.println("    </tr>");
-                    }
-
-                    out.println("    </informaltable>");
-                    out.println("  </section>");
-                }
-                out.println("</section>");
-            }
-
-        }
-
-        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/tooling/features-maven-plugin/NOTICE b/karaf/tooling/features-maven-plugin/NOTICE
deleted file mode 100644
index 8656d3d..0000000
--- a/karaf/tooling/features-maven-plugin/NOTICE
+++ /dev/null
@@ -1,16 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-II. Used Software
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/tooling/features-maven-plugin/pom.xml b/karaf/tooling/features-maven-plugin/pom.xml
deleted file mode 100644
index 1a44ed5..0000000
--- a/karaf/tooling/features-maven-plugin/pom.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-      <groupId>org.apache.felix.karaf.tooling</groupId>
-      <artifactId>tooling</artifactId>
-      <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.tooling</groupId>
-    <artifactId>features-maven-plugin</artifactId>
-    <packaging>maven-plugin</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: 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.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.felix.karaf.features</groupId>
-        <artifactId>org.apache.felix.karaf.features.core</artifactId>
-      </dependency>
-      <dependency>
-        <groupId>org.easymock</groupId>
-        <artifactId>easymock</artifactId>
-        <scope>test</scope>
-      </dependency>
-    </dependencies>
-
-</project>
diff --git a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/AddFeaturesToRepoMojo.java b/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/AddFeaturesToRepoMojo.java
deleted file mode 100644
index 666d041..0000000
--- a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/AddFeaturesToRepoMojo.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.tooling.features;
-
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Properties;
-import java.util.Hashtable;
-import java.util.Set;
-import java.util.HashSet;
-import java.io.File;
-import java.io.IOException;
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.BufferedOutputStream;
-import java.io.FileOutputStream;
-import java.io.FileInputStream;
-import java.net.URI;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.w3c.dom.*;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.artifact.Artifact;
-import org.xml.sax.SAXException;
-
-/**
- * Generates the features XML file
- *
- * @version $Revision: 1.1 $
- * @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 {
-
-    /**
-     * @parameter
-     */
-    private List<String> descriptors;
-
-    /**
-     * @parameter
-     */
-    private List<String> features;
-
-    /**
-     * @parameter
-     */
-    private File repository;
-
-    /**
-     * @parameter
-     */
-    private boolean skipNonMavenProtocols = true;
-
-    public void execute() throws MojoExecutionException, MojoFailureException {
-        try {
-            Map<String, Feature> featuresMap = new HashMap<String, Feature>();
-            for (String uri : descriptors) {
-                Repository repo = new Repository(URI.create(translateFromMaven(uri)));
-                for (Feature f : repo.getFeatures()) {
-                    featuresMap.put(f.getName(), f);
-                }
-            }
-            Set<String> transitiveFeatures = new HashSet<String>();
-            addFeatures(features, transitiveFeatures, featuresMap);
-            Set<String> bundles = new HashSet<String>();
-            for (String feature : transitiveFeatures) {
-                bundles.addAll(featuresMap.get(feature).getBundles());
-            }
-            getLog().info("Base repo: " + localRepo.getUrl());
-            for (String bundle : bundles) {
-                final int index = bundle.indexOf("mvn:");
-                if (index < 0) {
-                    if (skipNonMavenProtocols) {
-                        continue;
-                    }
-                    throw new MojoExecutionException("Bundle url is not a maven url: " + bundle);
-                }
-                else {
-                    bundle = bundle.substring(index);
-                }
-                // Truncate the URL when a '#' or a '?' is encountered
-                final int index1 = bundle.indexOf('?');
-                final int index2 = bundle.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) {
-                    bundle = bundle.substring(0, endIndex);
-                }
-                              
-                String[] parts = bundle.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;
-
-                Artifact artifact;
-                try {
-                    artifact = this.factory.createArtifactWithClassifier(groupId, artifactId, version, type, classifier);
-                    getLog().info("Copying bundle: " + bundle);
-                    resolver.resolve(artifact, this.remoteRepos, this.localRepo);
-                    copy(new FileInputStream(artifact.getFile()),
-                         repository,
-                         name,
-                         dir,
-                         new byte[8192]);
-                } catch (ArtifactResolutionException e) {
-                    getLog().error("Can't resolve bundle " + bundle, e);
-                } catch (ArtifactNotFoundException e) {
-                    getLog().error("Can't resolve bundle " + bundle, e);
-                }
-
-
-            }
-        } catch (MojoExecutionException e) {
-            throw e;
-        } catch (MojoFailureException e) {
-            throw e;
-        } catch (Exception e) {
-            throw new MojoExecutionException("Error populating repository", e);
-        }
-    }
-
-    private void addFeatures(List<String> features, Set<String> transitiveFeatures, Map<String, Feature> featuresMap) {
-        for (String feature : features) {
-            Feature f = featuresMap.get(feature);
-            if (f == null) {
-                throw new IllegalArgumentException("Unable to find the feature '" + feature + "'");
-            }
-            transitiveFeatures.add(feature);
-            addFeatures(f.getDependencies(), 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 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>>();
-
-        public Feature(String name) {
-            this.name = name;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public List<String> getDependencies() {
-            return dependencies;
-        }
-
-        public List<String> getBundles() {
-            return bundles;
-        }
-
-        public Map<String, Map<String, String>> getConfigurations() {
-            return configs;
-        }
-
-        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 static class Repository {
-
-        private URI uri;
-        private List<Feature> features;
-
-        public Repository(URI uri) {
-            this.uri = uri;
-        }
-
-        public URI getURI() {
-            return uri;
-        }
-
-        public Feature[] getFeatures() throws Exception {
-            if (features == null) {
-                load();
-            }
-            return features.toArray(new Feature[features.size()]);
-        }
-
-        public void load() 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");
-                    Feature f = new Feature(name);
-                    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 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/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesFileMojo.java b/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesFileMojo.java
deleted file mode 100644
index 4562b8b..0000000
--- a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesFileMojo.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.tooling.features;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.jar.Manifest;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipException;
-import java.util.zip.ZipFile;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.InvalidArtifactRTException;
-import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
-import org.apache.maven.artifact.metadata.ResolutionGroup;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.versioning.ArtifactVersion;
-import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
-import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
-import org.apache.maven.artifact.versioning.VersionRange;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-
-/**
- * Generates the features XML file
- * 
- * @version $Revision: 1.1 $
- * @goal generate-features-file
- * @phase compile
- * @execute phase="compile"
- * @requiresDependencyResolution runtime
- * @inheritByDefault true
- * @description Generates the features XML file
- */
-@SuppressWarnings("unchecked")
-public class GenerateFeaturesFileMojo extends MojoSupport {
-    protected static final String SEPARATOR = "/";
-
-    /**
-     * The file to generate
-     * 
-     * @parameter default-value="${project.build.directory}/classes/feature.xml"
-     */
-    private File outputFile;
-
-    /**
-     * The name of the feature, which defaults to the artifact ID if its not
-     * specified
-     * 
-     * @parameter default-value="${project.artifactId}"
-     */
-    private String featureName;
-
-    /**
-     * The artifact type for attaching the generated file to the project
-     * 
-     * @parameter default-value="xml"
-     */
-    private String attachmentArtifactType = "xml";
-
-    /**
-     * The artifact classifier for attaching the generated file to the project
-     * 
-     * @parameter default-value="features"
-     */
-    private String attachmentArtifactClassifier = "features";
-
-    /**
-     * Should we generate a <feature> for the current project?
-     * 
-     * @parameter default-value="false"
-     */
-    private boolean includeProject = false;
-
-    /**
-     * Should we generate a <feature> for the current project's <dependency>s?
-     * 
-     * @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.felix.karaf", 
-    			                                 "apache-felix-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/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesXmlMojo.java b/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesXmlMojo.java
deleted file mode 100644
index 6e6092c..0000000
--- a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesXmlMojo.java
+++ /dev/null
@@ -1,570 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.DefaultArtifactCollector;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.shared.dependency.tree.DependencyNode;
-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
-
-
-/**
- * Generates the features XML file
- * 
- * @version $Revision: 1.1 $
- * @goal generate-features-xml
- * @phase compile
- * @execute phase="compile"
- * @requiresDependencyResolution runtime
- * @inheritByDefault true
- * @description Generates the features XML file
- */
-@SuppressWarnings("unchecked")
-public class GenerateFeaturesXmlMojo extends MojoSupport {
-    protected static final String SEPARATOR = "/";
-    
-    /**
-     * The dependency tree builder to use.
-     * 
-     * @component
-     * @required
-     * @readonly
-     */
-    private DependencyTreeBuilder dependencyTreeBuilder;
-
-    /**
-     * The 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 {
-            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;
-            }
-               
-           }, new DefaultArtifactCollector());
-           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.felix.karaf", "apache-felix-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) {
-        return String.format("%s/%s/%s", artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion());
-    }
-
-    private class Feature {
-
-        private Stack<Artifact> artifacts = new Stack<Artifact>();
-        private final Artifact artifact;
-        
-        private Feature(Artifact artifact) {
-            super();
-            this.artifact = artifact;
-            artifacts.push(artifact);
-        }
-
-        public boolean push(Artifact item) {
-            if (artifacts.contains(item)) {
-                artifacts.remove(item);
-                artifacts.push(item);
-                return false;
-            }
-            if (!artifacts.contains(item)) {
-                artifacts.push(item);
-                return true;
-            }
-            return false;
-        }
-
-        public void write(PrintStream out) {
-            out.println("  <feature name='" + artifact.getArtifactId() + "' version='"
-            		+ artifact.getBaseVersion() + "'>");
-            
-            Stack<Artifact> resulting = new Stack<Artifact>();
-            resulting.addAll(artifacts);
-
-            // remove dependencies for included features
-            for (Artifact next : artifacts) {
-                if (isFeature(next)) {
-                    resulting.removeAll(features.get(next).getDependencies());
-                }
-            }
-            
-            while (!resulting.isEmpty()) {
-            	Artifact next = resulting.pop();
-                if (isFeature(next)) {
-                    out.println("    <feature version='"
-            		+ next.getBaseVersion() + "'>" + String.format("%s</feature>", next.getArtifactId()));
-                } else {
-            		out.println(String.format("    <bundle>mvn:%s/%s/%s</bundle>", 
-                            next.getGroupId(), next.getArtifactId(), next.getBaseVersion()));
-                }
-            }
-            out.println("  </feature>");
-        }
-        
-        public List<Artifact> getDependencies() {
-            List<Artifact> dependencies = new LinkedList<Artifact>(artifacts);
-            dependencies.remove(artifact);
-            return dependencies;
-        }
-    }
-}
diff --git a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/GraphArtifactCollector.java b/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/GraphArtifactCollector.java
deleted file mode 100644
index 05608d9..0000000
--- a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/GraphArtifactCollector.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.tooling.features;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.metadata.ResolutionGroup;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactCollector;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
-import org.apache.maven.artifact.resolver.CyclicDependencyException;
-import org.apache.maven.artifact.resolver.ResolutionListener;
-import org.apache.maven.artifact.resolver.ResolutionNode;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.artifact.versioning.ArtifactVersion;
-import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
-import org.apache.maven.artifact.versioning.VersionRange;
-
-/**
- * @version $Revision: 1.1 $
- */
-public class GraphArtifactCollector implements ArtifactCollector {
-    public ArtifactResolutionResult collect(
-            Set artifacts,
-            Artifact originatingArtifact,
-            ArtifactRepository localRepository,
-            List remoteRepositories,
-            ArtifactMetadataSource source,
-            ArtifactFilter filter,
-            List listeners) throws ArtifactResolutionException {
-        return collect(artifacts, originatingArtifact, Collections.EMPTY_MAP,
-                localRepository, remoteRepositories, source, filter, listeners);
-    }
-
-    public ArtifactResolutionResult collect(
-            Set artifacts,
-            Artifact originatingArtifact,
-            Map managedVersions,
-            ArtifactRepository localRepository,
-            List remoteRepositories,
-            ArtifactMetadataSource source,
-            ArtifactFilter filter,
-            List listeners) throws ArtifactResolutionException {
-        Map resolvedArtifacts = new HashMap();
-
-        ResolutionNode root = new ResolutionNode(originatingArtifact, remoteRepositories);
-        root.addDependencies(artifacts, remoteRepositories, filter);
-        recurse(root, resolvedArtifacts, managedVersions, localRepository,
-                remoteRepositories, source, filter, listeners);
-
-        Set set = new HashSet();
-        for (Iterator i = resolvedArtifacts.values().iterator(); i.hasNext();) {
-            List nodes = (List) i.next();
-            for (Iterator j = nodes.iterator(); j.hasNext();) {
-                ResolutionNode node = (ResolutionNode) j.next();
-                Artifact artifact = node.getArtifact();
-                if (!node.equals(root) && node.isActive() && node.filterTrail(filter)
-                        // If it was optional and not a direct dependency,
-                        // we don't add it or its children, just allow the
-                        // update of the version and scope
-                        && (node.isChildOfRootNode() || !artifact.isOptional())) {
-                    artifact.setDependencyTrail(node.getDependencyTrail());
-                    set.add(node);
-                }
-            }
-        }
-
-        ArtifactResolutionResult result = new ArtifactResolutionResult();
-        result.setArtifactResolutionNodes(set);
-        return result;
-    }
-
-    private void recurse(
-            ResolutionNode node,
-            Map resolvedArtifacts,
-            Map managedVersions,
-            ArtifactRepository localRepository,
-            List remoteRepositories,
-            ArtifactMetadataSource source,
-            ArtifactFilter filter,
-            List listeners) throws CyclicDependencyException, ArtifactResolutionException,
-            OverConstrainedVersionException {
-        fireEvent(ResolutionListener.TEST_ARTIFACT, listeners, node);
-
-        // TODO: use as a conflict resolver
-        Object key = node.getKey();
-        if (managedVersions.containsKey(key)) {
-            Artifact artifact = (Artifact) managedVersions.get(key);
-            fireEvent(ResolutionListener.MANAGE_ARTIFACT, listeners, node, artifact);
-            if (artifact.getVersion() != null) {
-                node.getArtifact().setVersion(artifact.getVersion());
-            }
-            if (artifact.getScope() != null) {
-                node.getArtifact().setScope(artifact.getScope());
-            }
-        }
-
-        List previousNodes = (List) resolvedArtifacts.get(key);
-        if (previousNodes != null) {
-            node = checkPreviousNodes(node, listeners, previousNodes);
-        }
-        else {
-            previousNodes = new ArrayList();
-            resolvedArtifacts.put(key, previousNodes);
-        }
-        previousNodes.add(node);
-
-        if (node.isActive()) {
-            fireEvent(ResolutionListener.INCLUDE_ARTIFACT, listeners, node);
-        }
-
-        // don't pull in the transitive deps of a system-scoped dependency.
-        if (node.isActive() && !Artifact.SCOPE_SYSTEM.equals(node.getArtifact().getScope())) {
-            fireEvent(ResolutionListener.PROCESS_CHILDREN, listeners, node);
-            for (Iterator i = node.getChildrenIterator(); i.hasNext();) {
-                ResolutionNode child = (ResolutionNode) i.next();
-                // We leave in optional ones, but don't pick up its dependencies
-                if (!child.isResolved()
-                        && (!child.getArtifact().isOptional() || child.isChildOfRootNode())) {
-                    Artifact artifact = child.getArtifact();
-                    try {
-                        if (artifact.getVersion() == null) {
-                            // set the recommended version
-                            // TODO: maybe its better to just pass the range
-                            // through to retrieval and use a transformation?
-                            ArtifactVersion version;
-                            version = getArtifactVersion(localRepository, remoteRepositories, source, artifact);
-
-                            artifact.selectVersion(version.toString());
-                            fireEvent(ResolutionListener.SELECT_VERSION_FROM_RANGE,
-                                    listeners, child);
-                        }
-
-                        ResolutionGroup rGroup = source.retrieve(artifact,
-                                localRepository, remoteRepositories);
-
-                        // TODO might be better to have source.retreive() throw
-                        // a specific exception for this situation
-                        // and catch here rather than have it return null
-                        if (rGroup == null) {
-                            // relocated dependency artifact is declared
-                            // excluded, no need to add and recurse further
-                            continue;
-                        }
-
-                        child.addDependencies(rGroup.getArtifacts(),
-                                rGroup.getResolutionRepositories(), filter);
-                    }
-                    catch (CyclicDependencyException e) {
-                        // would like to throw this, but we have crappy stuff in
-                        // the repo
-
-                        fireEvent(ResolutionListener.OMIT_FOR_CYCLE, listeners,
-                                new ResolutionNode(e.getArtifact(), remoteRepositories, child));
-                    }
-                    catch (ArtifactMetadataRetrievalException e) {
-                        artifact.setDependencyTrail(node.getDependencyTrail());
-                        throw new ArtifactResolutionException(
-                                "Unable to get dependency information: "
-                                        + e.getMessage(), artifact, e);
-                    }
-
-                    recurse(child, resolvedArtifacts, managedVersions,
-                            localRepository, remoteRepositories, source,
-                            filter, listeners);
-                }
-            }
-            fireEvent(ResolutionListener.FINISH_PROCESSING_CHILDREN, listeners,
-                    node);
-        }
-    }
-
-    private ArtifactVersion getArtifactVersion(
-            ArtifactRepository localRepository,
-            List remoteRepositories,
-            ArtifactMetadataSource source,
-            Artifact artifact) throws OverConstrainedVersionException,
-            ArtifactMetadataRetrievalException {
-        ArtifactVersion version;
-        if (!artifact.isSelectedVersionKnown()) {
-            List versions = artifact.getAvailableVersions();
-            if (versions == null) {
-                versions = source.retrieveAvailableVersions(
-                        artifact, localRepository,
-                        remoteRepositories);
-                artifact.setAvailableVersions(versions);
-            }
-
-            VersionRange versionRange = artifact.getVersionRange();
-
-            version = versionRange.matchVersion(versions);
-
-            if (version == null) {
-                if (versions.isEmpty()) {
-                    throw new OverConstrainedVersionException(
-                            "No versions are present in the repository for the artifact with a range "
-                                    + versionRange, artifact, remoteRepositories);
-                }
-                else {
-                    throw new OverConstrainedVersionException(
-                            "Couldn't find a version in "
-                                    + versions
-                                    + " to match range "
-                                    + versionRange,
-                            artifact, remoteRepositories);
-                }
-            }
-        }
-        else {
-            version = artifact.getSelectedVersion();
-        }
-        return version;
-    }
-
-    private ResolutionNode checkPreviousNodes(
-            ResolutionNode node,
-            List listeners,
-            List previousNodes) throws OverConstrainedVersionException {
-        for (Iterator i = previousNodes.iterator(); i.hasNext();) {
-            ResolutionNode previous = (ResolutionNode) i.next();
-            if (previous.isActive()) {
-                // Version mediation
-                VersionRange previousRange = previous.getArtifact().getVersionRange();
-                VersionRange currentRange = node.getArtifact().getVersionRange();
-                // TODO: why do we force the version on it? what if they
-                // don't match?
-                if (previousRange == null) {
-                    // version was already resolved
-                    node.getArtifact().setVersion(previous.getArtifact().getVersion());
-                }
-                else if (currentRange == null) {
-                    // version was already resolved
-                    previous.getArtifact().setVersion(node.getArtifact().getVersion());
-                }
-                else {
-                    // TODO: shouldn't need to double up on this work, only
-                    // done for simplicity of handling recommended
-                    // version but the restriction is identical
-                    VersionRange newRange = previousRange.restrict(currentRange);
-                    // TODO: ick. this forces the OCE that should have come
-                    // from the previous call. It is still correct
-                    if (newRange.isSelectedVersionKnown(previous.getArtifact())) {
-                        fireEvent(ResolutionListener.RESTRICT_RANGE,
-                                listeners, node, previous.getArtifact(),
-                                newRange);
-                    }
-                    previous.getArtifact().setVersionRange(newRange);
-                    node.getArtifact().setVersionRange(
-                            currentRange.restrict(previousRange));
-
-                    // Select an appropriate available version from the (now
-                    // restricted) range
-                    // Note this version was selected before to get the
-                    // appropriate POM
-                    // But it was reset by the call to setVersionRange on
-                    // restricting the version
-                    ResolutionNode[] resetNodes = {previous, node};
-                    for (int j = 0; j < 2; j++) {
-                        Artifact resetArtifact = resetNodes[j]
-                                .getArtifact();
-                        if (resetArtifact.getVersion() == null
-                                && resetArtifact.getVersionRange() != null
-                                && resetArtifact.getAvailableVersions() != null) {
-
-                            resetArtifact
-                                    .selectVersion(resetArtifact
-                                            .getVersionRange()
-                                            .matchVersion(
-                                                    resetArtifact
-                                                            .getAvailableVersions())
-                                            .toString());
-                            fireEvent(ResolutionListener.SELECT_VERSION_FROM_RANGE,
-                                    listeners, resetNodes[j]);
-                        }
-                    }
-                }
-
-                // Conflict Resolution
-                // TODO: use as conflict resolver(s), chain
-
-                // TODO: should this be part of mediation?
-                // previous one is more dominant
-                if (previous.getDepth() <= node.getDepth()) {
-                    checkScopeUpdate(node, previous, listeners);
-                }
-                else {
-                    checkScopeUpdate(previous, node, listeners);
-                }
-
-                if (previous.getDepth() <= node.getDepth()) {
-                    // previous was nearer
-                    fireEvent(ResolutionListener.OMIT_FOR_NEARER,
-                            listeners, node, previous.getArtifact());
-                    node.disable();
-                    node = previous;
-                }
-                else {
-                    fireEvent(ResolutionListener.OMIT_FOR_NEARER,
-                            listeners, previous, node.getArtifact());
-                    previous.disable();
-                }
-            }
-        }
-        return node;
-    }
-
-    private void checkScopeUpdate(ResolutionNode farthest,
-            ResolutionNode nearest, List listeners) {
-        boolean updateScope = false;
-        Artifact farthestArtifact = farthest.getArtifact();
-        Artifact nearestArtifact = nearest.getArtifact();
-
-        if (Artifact.SCOPE_RUNTIME.equals(farthestArtifact.getScope())
-                && (Artifact.SCOPE_TEST.equals(nearestArtifact.getScope()) || Artifact.SCOPE_PROVIDED
-                .equals(nearestArtifact.getScope()))) {
-            updateScope = true;
-        }
-
-        if (Artifact.SCOPE_COMPILE.equals(farthestArtifact.getScope())
-                && !Artifact.SCOPE_COMPILE.equals(nearestArtifact.getScope())) {
-            updateScope = true;
-        }
-
-        // current POM rules all
-        if (nearest.getDepth() < 2 && updateScope) {
-            updateScope = false;
-
-            fireEvent(ResolutionListener.UPDATE_SCOPE_CURRENT_POM, listeners,
-                    nearest, farthestArtifact);
-        }
-
-        if (updateScope) {
-            fireEvent(ResolutionListener.UPDATE_SCOPE, listeners, nearest,
-                    farthestArtifact);
-
-            // previously we cloned the artifact, but it is more effecient to
-            // just update the scope
-            // if problems are later discovered that the original object needs
-            // its original scope value, cloning may
-            // again be appropriate
-            nearestArtifact.setScope(farthestArtifact.getScope());
-        }
-    }
-
-    private void fireEvent(int event, List listeners, ResolutionNode node) {
-        fireEvent(event, listeners, node, null);
-    }
-
-    private void fireEvent(int event, List listeners, ResolutionNode node,
-            Artifact replacement) {
-        fireEvent(event, listeners, node, replacement, null);
-    }
-
-    private void fireEvent(int event, List listeners, ResolutionNode node,
-            Artifact replacement, VersionRange newRange) {
-        for (Iterator i = listeners.iterator(); i.hasNext();) {
-            ResolutionListener listener = (ResolutionListener) i.next();
-
-            switch (event) {
-                case ResolutionListener.TEST_ARTIFACT:
-                    listener.testArtifact(node.getArtifact());
-                    break;
-                case ResolutionListener.PROCESS_CHILDREN:
-                    listener.startProcessChildren(node.getArtifact());
-                    break;
-                case ResolutionListener.FINISH_PROCESSING_CHILDREN:
-                    listener.endProcessChildren(node.getArtifact());
-                    break;
-                case ResolutionListener.INCLUDE_ARTIFACT:
-                    listener.includeArtifact(node.getArtifact());
-                    break;
-                case ResolutionListener.OMIT_FOR_NEARER:
-                    String version = node.getArtifact().getVersion();
-                    String replacementVersion = replacement.getVersion();
-                    if (version != null ? !version.equals(replacementVersion)
-                            : replacementVersion != null) {
-                        listener.omitForNearer(node.getArtifact(), replacement);
-                    }
-                    break;
-                case ResolutionListener.OMIT_FOR_CYCLE:
-                    listener.omitForCycle(node.getArtifact());
-                    break;
-                case ResolutionListener.UPDATE_SCOPE:
-                    listener
-                            .updateScope(node.getArtifact(), replacement.getScope());
-                    break;
-                case ResolutionListener.UPDATE_SCOPE_CURRENT_POM:
-                    listener.updateScopeCurrentPom(node.getArtifact(), replacement
-                            .getScope());
-                    break;
-                case ResolutionListener.MANAGE_ARTIFACT:
-                    listener.manageArtifact(node.getArtifact(), replacement);
-                    break;
-                case ResolutionListener.SELECT_VERSION_FROM_RANGE:
-                    listener.selectVersionFromRange(node.getArtifact());
-                    break;
-                case ResolutionListener.RESTRICT_RANGE:
-                    if (node.getArtifact().getVersionRange().hasRestrictions()
-                            || replacement.getVersionRange().hasRestrictions()) {
-                        listener.restrictRange(node.getArtifact(), replacement,
-                                newRange);
-                    }
-                    break;
-                default:
-                    throw new IllegalStateException("Unknown event: " + event);
-            }
-        }
-    }
-}
diff --git a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/ManifestUtils.java b/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/ManifestUtils.java
deleted file mode 100644
index d21a3d9..0000000
--- a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/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.felix.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/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/MojoSupport.java b/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/MojoSupport.java
deleted file mode 100644
index 7d491e5..0000000
--- a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/MojoSupport.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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.resolver.ArtifactCollector;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
-import org.apache.maven.artifact.versioning.VersionRange;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.DependencyManagement;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectBuilder;
-import org.apache.maven.project.MavenProjectHelper;
-import org.apache.maven.project.ProjectBuildingException;
-
-/**
- * @version $Revision: 1.1 $
- */
-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 remoteRepos;
-
-    /**
-     * @component
-     */
-    protected ArtifactMetadataSource artifactMetadataSource;
-
-    /**
-     * @component
-     */
-    protected ArtifactResolver resolver;
-
-    protected ArtifactCollector collector = new GraphArtifactCollector();
-
-    /**
-     * @component
-     */
-    protected ArtifactFactory factory;
-
-    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 localRepo.getProtocol() + ":///" + baseDir;
-         } else {
-                 return localRepo.getUrl();
-         }
-    }
-}
diff --git a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/Node.java b/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/Node.java
deleted file mode 100644
index 18fe8bc..0000000
--- a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/Node.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.karaf.tooling.features;
-
-import java.util.Set;
-import java.util.HashSet;
-
-import org.apache.maven.artifact.Artifact;
-
-/**
- * @version $Revision: 1.1 $
-*/
-public class Node {
-    private Set children = new HashSet();
-    private Set parents = new HashSet();
-    private Artifact artifact;
-
-    public Set getChildren() {
-        return children;
-    }
-
-    public Artifact getArtifact() {
-        return artifact;
-    }
-
-    public Set getParents() {
-        return parents;
-    }
-
-    public void setChildren(Set children) {
-        this.children = children;
-    }
-
-    public void setParents(Set parents) {
-        this.parents = parents;
-    }
-
-    public void setArtifact(Artifact artifact) {
-        this.artifact = artifact;
-    }
-}
diff --git a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/ResolutionListenerImpl.java b/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/ResolutionListenerImpl.java
deleted file mode 100644
index c43dff2..0000000
--- a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/ResolutionListenerImpl.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.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;
-
-/**
- * @author Edwin Punzalan
- * @version $Revision: 1.1 $
- */
-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/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/ValidateFeaturesMojo.java b/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/ValidateFeaturesMojo.java
deleted file mode 100644
index dc1fde0..0000000
--- a/karaf/tooling/features-maven-plugin/src/main/java/org/apache/felix/karaf/tooling/features/ValidateFeaturesMojo.java
+++ /dev/null
@@ -1,515 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.tooling.features;
-
-import static org.apache.felix.karaf.tooling.features.ManifestUtils.getExports;
-import static org.apache.felix.karaf.tooling.features.ManifestUtils.getMandatoryImports;
-import static org.apache.felix.karaf.tooling.features.ManifestUtils.matches;
-
-import java.io.*;
-import java.net.URI;
-import java.util.*;
-import java.util.jar.Manifest;
-import java.util.zip.ZipException;
-import java.util.zip.ZipFile;
-
-import org.apache.felix.karaf.features.Feature;
-import org.apache.felix.karaf.features.Repository;
-import org.apache.felix.karaf.features.internal.RepositoryImpl;
-import org.apache.felix.utils.manifest.Clause;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.DefaultArtifactRepository;
-import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.DefaultArtifactCollector;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.shared.dependency.tree.DependencyNode;
-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
-
-/**
- * Validates a features XML file
- * 
- * @version $Revision: 1.1 $
- * @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 = "!";
-
-    /**
-     * The dependency tree builder to use.
-     *
-     * @component
-     * @required
-     * @readonly
-     */
-    private DependencyTreeBuilder dependencyTreeBuilder;
-
-    /**
-     * 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 we wanna parse to get jre exported package in config.properties
-     * 
-     * @parameter default-value="jre-1.5"
-     */
-    private String jreVersion;
-
-    /**
-     *  The repositories which are included from the plugin config   
-     *  @parameter 
-     */
-     private List<String> repositories;   
-    
-    /*
-     * A map to cache the mvn: uris and the artifacts that correspond with them
-     */
-    private Map<String, Artifact> bundles = new HashMap<String, Artifact>();
-
-    /*
-     * A map to cache manifests that have been extracted from the bundles
-     */
-    private Map<Artifact, Manifest> manifests = new HashMap<Artifact, 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();
-            Repository repository = new RepositoryImpl(file.toURI());
-            analyze(repository);
-            validate(repository);
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new MojoExecutionException(String.format("Unable to validate %s: %s", file.getAbsolutePath(), e.getMessage()), e);
-        }
-
-    }
-
-    /*
-     * Prepare for validation by determing system and Karaf exports
-     */
-    private void prepare() throws Exception {
-        info("== Preparing for validation ==");
-        info(" - getting list of system bundle exports");
-        readSystemPackages();
-        info(" - getting list of provided bundle exports");
-        readProvidedBundles();
-    }
-
-    /*
-     * 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)));
-        		features.add(dependency.getFeatures());
-        		validateBundlesAvailable(dependency);
-        		analyzeExports(dependency);
-        	}
-        }
-
-        for (URI uri : repository.getRepositories()) {
-            Artifact artifact = resolve(uri.toString());
-            Repository dependency  = new RepositoryImpl(new File(localRepo.getBasedir(), localRepo.pathOf(artifact)).toURI());
-            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;
-            }
-
-        }, new DefaultArtifactCollector());
-        tree.accept(new DependencyNodeVisitor() {
-            public boolean endVisit(DependencyNode node) {
-                // we want the next sibling too
-                return true;
-            }
-
-            public boolean visit(DependencyNode node) {
-                if (node.getState() != DependencyNode.OMITTED_FOR_CONFLICT) {
-                    Artifact artifact = node.getArtifact();
-                    info("    scanning %s for exports", artifact);
-                    if (Artifact.SCOPE_PROVIDED.equals(artifact.getScope()) && !artifact.getType().equals("pom")) {
-                        try {
-                            for (Clause clause : ManifestUtils.getExports(getManifest(artifact))) {
-                                getLog().debug(" adding " + clause.getName() + " to list of available packages");
-                                systemExports.add(clause.getName());
-                            }
-                        } catch (ArtifactResolutionException e) {
-                            error("Unable to find bundle exports for %s: %s", e, artifact, e.getMessage());
-                        } catch (ArtifactNotFoundException e) {
-                            error("Unable to find bundle exports for %s: %s", e, artifact, e.getMessage());
-                        } catch (IOException e) {
-                            error("Unable to find bundle exports for %s: %s", e, artifact, e.getMessage());
-                        }
-                    }
-                }
-                // we want the children too
-                return true;
-            }
-        });
-    }
-
-    /*
-     * Read system packages from a properties file
-     * //TODO: we should probably grab this file from the Karaf distro itself instead of duplicating it in the plugin
-     */
-    private void readSystemPackages() throws IOException {
-        Properties properties = new Properties();
-        if (karafConfig.equals("config.properties")) {
-        	properties.load(getClass().getClassLoader().getResourceAsStream("config.properties"));
-        } else {
-        	properties.load(new FileInputStream(new File(karafConfig)));
-        }
-
-        String packages = (String) properties.get(jreVersion);
-        for (String pkg : packages.split(";")) {
-            systemExports .add(pkg.trim());
-        }
-        for (String pkg : packages.split(",")) {
-            systemExports .add(pkg.trim());
-        }
-    }
-
-    /*
-     * Analyze exports in all features in the repository without validating the features
-     * (e.g. used for <repository> elements found in a descriptor)
-     */
-    private void analyzeExports(Repository repository) throws Exception {
-        for (Feature feature : repository.getFeatures()) {
-            Set<Clause> exports = new HashSet<Clause>();
-            for (String bundle : feature.getBundles()) {
-                exports.addAll(getExports(getManifest(bundles.get(bundle))));
-            }
-            info("    scanning feature %s for exports", feature.getName());
-            featureExports.put(feature.getName(), exports);
-        }
-    }
-
-    /*
-     * Check if all the bundles can be downloaded and are actually OSGi bundles and not plain JARs
-     */
-    private void validateBundlesAvailable(Repository repository) throws Exception {
-        for (Feature feature : repository.getFeatures()) {
-            for (String bundle : feature.getBundles()) {
-                // this will throw an exception if the artifact can not be resolved
-                final Artifact artifact = resolve(bundle);
-                bundles.put(bundle, artifact);
-                if (isBundle(artifact)) {
-                    manifests.put(artifact, getManifest(artifact));
-                } else {
-                    throw new Exception(String.format("%s is not an OSGi bundle", bundle));
-                }
-            }
-        }
-    }
-
-    /*
-     * Validate if all features in a repository have bundles which can be resolved
-     */
-    private void validateImportsExports(Repository repository) throws ArtifactResolutionException, ArtifactNotFoundException, Exception {
-        for (Feature feature : repository.getFeatures()) {
-            // make sure the feature hasn't been validated before as a dependency
-            if (!featureExports.containsKey(feature.getName())) {
-                validateImportsExports(feature);
-            }
-        }
-    }
-
-    /*
-     * Validate if all imports for a feature are being matched with exports
-     */
-    private void validateImportsExports(Feature feature) throws Exception {
-        Map<Clause, String> imports = new HashMap<Clause, String>();
-        Set<Clause> exports = new HashSet<Clause>();
-        for (Feature dependency : feature.getDependencies()) {
-            if (featureExports.containsKey(dependency.getName())) {
-                exports.addAll(featureExports.get(dependency.getName()));
-            } else {
-                validateImportsExports(features.get(dependency.getName(), dependency.getVersion()));
-            }
-        }
-        for (String bundle : feature.getBundles()) {
-            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(Artifact artifact) {
-        if ("bundle".equals(artifact.getArtifactHandler().getPackaging())) {
-            return true;
-        } else {
-            try {
-                return ManifestUtils.isBundle(getManifest(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(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());
-        }
-        // 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()));
-            return new Manifest(file.getInputStream(file.getEntry("META-INF/MANIFEST.MF")));
-        } finally {
-            System.setErr(original);
-        }
-    }
-
-    /*
-     * Resolve an artifact, downloading it from remote repositories when necessary
-     */
-    private Artifact resolve(String bundle) throws Exception, ArtifactNotFoundException {
-        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;
-        }
-        
-    }
-
-    /*
-     * 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/tooling/features-maven-plugin/src/main/resources/config.properties b/karaf/tooling/features-maven-plugin/src/main/resources/config.properties
deleted file mode 100644
index 870e83c..0000000
--- a/karaf/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/tooling/features-maven-plugin/src/test/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesFileMojoTest.java b/karaf/tooling/features-maven-plugin/src/test/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesFileMojoTest.java
deleted file mode 100644
index 4f8c499..0000000
--- a/karaf/tooling/features-maven-plugin/src/test/java/org/apache/felix/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.felix.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/tooling/features-maven-plugin/src/test/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java b/karaf/tooling/features-maven-plugin/src/test/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java
deleted file mode 100644
index dff00cf..0000000
--- a/karaf/tooling/features-maven-plugin/src/test/java/org/apache/felix/karaf/tooling/features/GenerateFeaturesXmlMojoTest.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.felix.karaf.tooling.features;
-
-import org.apache.maven.artifact.Artifact;
-import org.easymock.EasyMock;
-
-import static org.easymock.EasyMock.*;
-
-import junit.framework.TestCase;
-
-/**
- * Test cases for {@link GenerateFeaturesXmlMojo}
- */
-public class GenerateFeaturesXmlMojoTest extends TestCase {
-    
-    public void testToString() throws Exception {
-        Artifact artifact = EasyMock.createMock(Artifact.class);
-
-        expect(artifact.getGroupId()).andReturn("org.apache.felix.karaf.test");
-        expect(artifact.getArtifactId()).andReturn("test-artifact");
-        expect(artifact.getVersion()).andReturn("1.2.3");
-        
-        replay(artifact);
-        
-        assertEquals("org.apache.felix.karaf.test/test-artifact/1.2.3", GenerateFeaturesXmlMojo.toString(artifact));
-    }
-
-}
diff --git a/karaf/tooling/features-maven-plugin/src/test/java/org/apache/felix/karaf/tooling/features/ManifestUtilsTest.java b/karaf/tooling/features-maven-plugin/src/test/java/org/apache/felix/karaf/tooling/features/ManifestUtilsTest.java
deleted file mode 100644
index efa1136..0000000
--- a/karaf/tooling/features-maven-plugin/src/test/java/org/apache/felix/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.felix.karaf.tooling.features;
-
-import static org.apache.felix.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.felix.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/tooling/pom.xml b/karaf/tooling/pom.xml
deleted file mode 100644
index 5122c27..0000000
--- a/karaf/tooling/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.felix.karaf</groupId>
-        <artifactId>karaf</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.tooling</groupId>
-    <artifactId>tooling</artifactId>
-    <packaging>pom</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Tooling</name>
-
-    <modules>
-        <module>features-maven-plugin</module>
-        <module>cmdhelp-maven-plugin</module>
-        <module>testing</module>
-    </modules>
-
-</project>
diff --git a/karaf/tooling/testing/pom.xml b/karaf/tooling/testing/pom.xml
deleted file mode 100644
index 1961923..0000000
--- a/karaf/tooling/testing/pom.xml
+++ /dev/null
@@ -1,146 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-      <groupId>org.apache.felix.karaf.tooling</groupId>
-      <artifactId>tooling</artifactId>
-      <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.tooling</groupId>
-    <artifactId>org.apache.felix.karaf.tooling.testing</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Testing environment</name>
-
-    <description>
-      A bundle to help using Pax-Exam and Karaf.
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <!-- The assembly and all the dependencies -->
-        <dependency>
-            <groupId>org.apache.felix.karaf</groupId>
-            <artifactId>apache-felix-karaf</artifactId>
-            <type>xml</type>
-            <classifier>features</classifier>
-        </dependency>
-        <!-- Pax EXAM -->
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-junit</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-container-default</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-junit-extender-impl</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <resources>
-            <resource>
-                <directory>${project.basedir}/src/main/resources</directory>
-                <includes>
-                    <include>**/*</include>
-                </includes>
-            </resource>
-        </resources>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-resources-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>copy-filtered</id>
-                        <!-- here the phase you need -->
-                        <phase>compile</phase>
-                        <goals>
-                            <goal>copy-resources</goal>
-                        </goals>
-                        <configuration>
-                            <outputDirectory>${basedir}/target/classes/</outputDirectory>
-                            <resources>
-                                <resource>
-                                    <directory>../../assembly/src/main/filtered-resources/etc</directory>
-                                    <filtering>true</filtering>
-                                    <includes>
-                                        <include>config.properties</include>
-                                        <include>startup.properties</include>
-                                    </includes>
-                                </resource>
-                            </resources>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- generate dependencies versions -->
-            <plugin>
-                <groupId>org.apache.servicemix.tooling</groupId>
-                <artifactId>depends-maven-plugin</artifactId>
-                <version>1.1</version>
-                <executions>
-                    <execution>
-                        <id>generate-depends-file</id>
-                        <goals>
-                            <goal>generate-depends-file</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Export-Package>org.apache.felix.karaf.testing;version=${project.version}</Export-Package>
-                        <Import-Package>
-                            !org.apache.felix.karaf.testing*,
-                            *
-                        </Import-Package>
-                        <Include-Resource>
-                            {maven-resources},
-                            org/apache/felix/karaf/testing/config.properties=target/classes/config.properties,
-                            org/apache/felix/karaf/testing/startup.properties=target/classes/startup.properties
-                        </Include-Resource>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf/tooling/testing/src/main/java/org/apache/felix/karaf/testing/AbstractIntegrationTest.java b/karaf/tooling/testing/src/main/java/org/apache/felix/karaf/testing/AbstractIntegrationTest.java
deleted file mode 100644
index 17177b6..0000000
--- a/karaf/tooling/testing/src/main/java/org/apache/felix/karaf/testing/AbstractIntegrationTest.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.felix.karaf.testing;
-
-import java.util.Collection;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.ops4j.pax.exam.Inject;
-import org.ops4j.pax.exam.options.MavenArtifactProvisionOption;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Filter;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-
-import static org.apache.felix.karaf.testing.Helper.mavenBundle;
-
-public abstract class AbstractIntegrationTest {
-
-    public static final long DEFAULT_TIMEOUT = 30000;
-
-    @Inject
-    protected BundleContext bundleContext;
-
-    protected <T> T getOsgiService(Class<T> type, long timeout) {
-        return getOsgiService(type, null, timeout);
-    }
-
-    protected <T> T getOsgiService(Class<T> type) {
-        return getOsgiService(type, null, DEFAULT_TIMEOUT);
-    }
-
-    protected <T> T getOsgiService(Class<T> type, String filter, long timeout) {
-        ServiceTracker tracker = null;
-        try {
-            String flt;
-            if (filter != null) {
-                if (filter.startsWith("(")) {
-                    flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")" + filter + ")";
-                } else {
-                    flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")(" + filter + "))";
-                }
-            } else {
-                flt = "(" + Constants.OBJECTCLASS + "=" + type.getName() + ")";
-            }
-            Filter osgiFilter = FrameworkUtil.createFilter(flt);
-            tracker = new ServiceTracker(bundleContext, osgiFilter, null);
-            tracker.open(true);
-            // Note that the tracker is not closed to keep the reference
-            // This is buggy, as the service reference may change i think
-            Object svc = type.cast(tracker.waitForService(timeout));
-            if (svc == null) {
-                Dictionary dic = bundleContext.getBundle().getHeaders();
-                System.err.println("Test bundle headers: " + explode(dic));
-
-                for (ServiceReference ref : asCollection(bundleContext.getAllServiceReferences(null, null))) {
-                    System.err.println("ServiceReference: " + ref);
-                }
-
-                for (ServiceReference ref : asCollection(bundleContext.getAllServiceReferences(null, flt))) {
-                    System.err.println("Filtered ServiceReference: " + ref);
-                }
-
-                throw new RuntimeException("Gave up waiting for service " + flt);
-            }
-            return type.cast(svc);
-        } catch (InvalidSyntaxException e) {
-            throw new IllegalArgumentException("Invalid filter", e);
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    protected Bundle installBundle(String groupId, String artifactId) throws Exception {
-        MavenArtifactProvisionOption mvnUrl = mavenBundle(groupId, artifactId);
-        return bundleContext.installBundle(mvnUrl.getURL());
-    }
-
-    protected Bundle getInstalledBundle(String symbolicName) {
-        for (Bundle b : bundleContext.getBundles()) {
-            if (b.getSymbolicName().equals(symbolicName)) {
-                return b;
-            }
-        }
-        return null;
-    }
-
-    /*
-     * Explode the dictionary into a ,-delimited list of key=value pairs
-     */
-    private static String explode(Dictionary dictionary) {
-        Enumeration keys = dictionary.keys();
-        StringBuffer result = new StringBuffer();
-        while (keys.hasMoreElements()) {
-            Object key = keys.nextElement();
-            result.append(String.format("%s=%s", key, dictionary.get(key)));
-            if (keys.hasMoreElements()) {
-                result.append(", ");
-            }
-        }
-        return result.toString();
-    }
-
-    /*
-     * Provides an iterable collection of references, even if the original array is null
-     */
-    private static final Collection<ServiceReference> asCollection(ServiceReference[] references) {
-        List<ServiceReference> result = new LinkedList<ServiceReference>();
-        if (references != null) {
-            for (ServiceReference reference : references) {
-                result.add(reference);
-            }
-        }
-        return result;
-    }
-
-}
\ No newline at end of file
diff --git a/karaf/tooling/testing/src/main/java/org/apache/felix/karaf/testing/Helper.java b/karaf/tooling/testing/src/main/java/org/apache/felix/karaf/testing/Helper.java
deleted file mode 100644
index e509575..0000000
--- a/karaf/tooling/testing/src/main/java/org/apache/felix/karaf/testing/Helper.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.testing;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.ops4j.pax.exam.CoreOptions;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.options.MavenArtifactProvisionOption;
-import org.ops4j.pax.exam.options.SystemPropertyOption;
-
-import static org.ops4j.pax.exam.CoreOptions.bootClasspathLibrary;
-import static org.ops4j.pax.exam.CoreOptions.bootDelegationPackages;
-import static org.ops4j.pax.exam.CoreOptions.frameworkStartLevel;
-import static org.ops4j.pax.exam.CoreOptions.maven;
-import static org.ops4j.pax.exam.CoreOptions.wrappedBundle;
-import static org.ops4j.pax.exam.OptionUtils.combine;
-import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption;
-
-/**
- * Helper class for setting up a pax-exam test environment for karaf.
- *
- * A simple configuration for pax-exam can be create using the following
- * code:
- * <pre>
- *   @Configuration
- *   public static Option[] configuration() throws Exception{
- *       return combine(
- *           // Default karaf environment
- *           Helper.getDefaultOptions(),
- *           // Test on both equinox and felix
- *           equinox(), felix()
- *       );
- *   }
- * </pre>
- *
- */
-public final class Helper {
-
-    private Helper() {
-    }
-
-    /**
-     *  Create an provisioning option for the specified maven artifact
-     * (groupId and artifactId), using the version found in the list
-     * of dependencies of this maven project.
-     *
-     * @param groupId the groupId of the maven bundle
-     * @param artifactId the artifactId of the maven bundle
-     * @return the provisioning option for the given bundle
-     */
-    public static MavenArtifactProvisionOption mavenBundle(String groupId, String artifactId) {
-        return CoreOptions.mavenBundle(groupId, artifactId).versionAsInProject();
-    }
-
-    /**
-     * Return a map of system properties for karaf.
-     * The default karaf home directory is "target/karaf.home".
-     *
-     * @return a list of system properties for karaf
-     */
-    public static Properties getDefaultSystemOptions() {
-        return getDefaultSystemOptions("target/karaf.home");
-    }
-
-    /**
-     * Return a map of system properties for karaf,
-     * using the specified folder for the karaf home directory.
-     *
-     * @param karafHome the karaf home directory
-     * @return a list of system properties for karaf
-     */
-    public static Properties getDefaultSystemOptions(String karafHome) {
-        Properties sysProps = new Properties();
-        sysProps.setProperty("karaf.name", "root");
-        sysProps.setProperty("karaf.home", karafHome);
-        sysProps.setProperty("karaf.base", karafHome);
-        sysProps.setProperty("karaf.startLocalConsole", "false");
-        sysProps.setProperty("karaf.startRemoteShell", "false");
-        sysProps.setProperty("org.osgi.framework.startlevel.beginning", "100");
-        return sysProps;
-    }
-
-    /**
-     * Return an array of pax-exam options to correctly configure the osgi
-     * framework for karaf.
-     *
-     * @param sysOptions test-specific system property options
-     * @return default pax-exam options for karaf osgi framework
-     */
-    public static Option[] getDefaultConfigOptions(SystemPropertyOption... sysOptions) {
-        return getDefaultConfigOptions(getDefaultSystemOptions(),
-                                       getResource("/org/apache/felix/karaf/testing/config.properties"),
-                                       sysOptions);
-    }
-
-    /**
-     * Return an array of pax-exam options to configure the osgi
-     * framework for karaf, given the system properties and the
-     * location of the osgi framework properties file.
-     *
-     * @param sysProps karaf system properties
-     * @param configProperties the URL to load the osgi framework properties from
-     * @param sysOptions test-specific system property options
-     * @return pax-exam options for karaf osgi framework
-     */
-    public static Option[] getDefaultConfigOptions(Properties sysProps, URL configProperties, SystemPropertyOption... sysOptions) {
-        // Load props
-        Properties configProps = loadProperties(configProperties);
-
-        // Set system props
-        for (Enumeration e = sysProps.propertyNames(); e.hasMoreElements();) {
-            String key = (String) e.nextElement();
-            configProps.setProperty(key, sysProps.getProperty(key));
-        }
-        // Perform variable substitution for system properties.
-        for (Enumeration e = configProps.propertyNames(); e.hasMoreElements();) {
-            String name = (String) e.nextElement();
-            configProps.setProperty(name, substVars(configProps.getProperty(name), name, null, configProps));
-        }
-        // Transform system properties to VM options
-        List<Option> options = new ArrayList<Option>();
-        String vmOptions = "";
-        for (Enumeration e = configProps.propertyNames(); e.hasMoreElements();) {
-            String name = (String) e.nextElement();
-            String value = configProps.getProperty(name);
-            value = align(value);
-            if ("org.osgi.framework.system.packages".equals(name)) {
-                String extra = align(configProps.getProperty("org.osgi.framework.system.packages.extra"));
-                vmOptions = vmOptions + " -D" + name + "=" + value + "," + extra;
-            } else if ("org.osgi.framework.bootdelegation".equals(name)) {
-                options.add(bootDelegationPackages(value));
-            } else {
-                vmOptions = vmOptions + " -D" + name + "=" + value;
-            }
-        }
-
-        // add test-specific system properties
-        if (sysOptions != null) {
-            for (SystemPropertyOption sysOption : sysOptions) {
-                vmOptions = vmOptions + " -D" + sysOption.getKey() + "=" + sysOption.getValue();
-            }
-        }
-
-        if (configProps.getProperty("org.osgi.framework.startlevel.beginning") != null) {
-            options.add(frameworkStartLevel(Integer.parseInt(configProps.getProperty("org.osgi.framework.startlevel.beginning"))));
-        }
-
-        options.add(vmOption(vmOptions));
- 
-        return options.toArray(new Option[options.size()]);
-    }
-
-    /**
-     * Return an array of pax-exam options for the provisioning of karaf system bundles.
-     *
-     * @return an array of pax-exam options for provisioning karaf system bundles
-     */
-    public static Option[] getDefaultProvisioningOptions() {
-        return getDefaultProvisioningOptions(getDefaultSystemOptions(),
-                                            getResource("/org/apache/felix/karaf/testing/startup.properties"));
-    }
-
-    /**
-     * Return an array of pax-exam options for the provisioning of karaf system bundles,
-     * given the karaf system properties and the location of the startup bundles config file.
-     *
-     * @param sysProps karaf system properties
-     * @param startupProperties the URL to load the system bundles from
-     * @return an array of pax-exam options for provisioning karaf system bundles
-     */
-    public static Option[] getDefaultProvisioningOptions(Properties sysProps, URL startupProperties) {
-        Properties startupProps = loadProperties(startupProperties);
-        // Perform variable substitution for system properties.
-        for (Enumeration e = startupProps.propertyNames(); e.hasMoreElements();) {
-            String name = (String) e.nextElement();
-            startupProps.setProperty(name, substVars(startupProps.getProperty(name), name, null, sysProps));
-        }
-        // Transform to sys props options
-        List<Option> options = new ArrayList<Option>();
-        options.add(bootClasspathLibrary(mavenBundle("org.apache.felix.karaf.jaas", "org.apache.felix.karaf.jaas.boot")).afterFramework());
-        options.add(bootClasspathLibrary(mavenBundle("org.apache.felix.karaf", "org.apache.felix.karaf.main")).afterFramework());
-        for (Enumeration e = startupProps.propertyNames(); e.hasMoreElements();) {
-            String name = (String) e.nextElement();
-            String value = startupProps.getProperty(name);
-            MavenArtifactProvisionOption opt = convertToMaven(name);
-            if (opt.getURL().contains("org.apache.felix.karaf.features")) {
-                opt.noStart();
-            }
-            opt.startLevel(Integer.parseInt(value));
-            options.add(opt);
-        }
-        options.add(mavenBundle("org.apache.felix.karaf.tooling", "org.apache.felix.karaf.tooling.testing"));
-        options.add(wrappedBundle(maven("org.ops4j.pax.exam", "pax-exam-container-default")));
-        // We need to add pax-exam-junit here when running with the ibm
-        // jdk to avoid the following exception during the test run:
-        // ClassNotFoundException: org.ops4j.pax.exam.junit.Configuration
-        if ("IBM Corporation".equals(System.getProperty("java.vendor"))) {
-            options.add(wrappedBundle(maven("org.ops4j.pax.exam", "pax-exam-junit")));
-        }
-        return options.toArray(new Option[options.size()]);
-    }
-
-    /**
-     * Return an array of options for setting up a pax-exam test environment for karaf.
-     *
-     * @return an array of pax-exam options
-     */
-    public static Option[] getDefaultOptions() {
-        return getDefaultOptions(null);
-    }
-
-    /**
-     * Return an array of options for setting up a pax-exam test environment for karaf.
-     *
-     * @param sysOptions test-specific system property options
-     * @return an array of pax-exam options
-     */
-    public static Option[] getDefaultOptions(SystemPropertyOption... sysOptions) {
-        return combine(getDefaultConfigOptions(sysOptions), getDefaultProvisioningOptions());
-    }
-
-    /**
-     * Retrieve the pax-exam option for provisioning the given maven bundle.
-     *
-     * @param options the list of pax-exam options
-     * @param groupId the maven group id
-     * @param artifactId the maven artifact id
-     * @return the pax-exam provisioning option for the bundle or <code>null</code> if not found
-     */
-    public static MavenArtifactProvisionOption findMaven(Option[] options, String groupId, String artifactId) {
-        for (Option option : options) {
-            if (option instanceof MavenArtifactProvisionOption) {
-                MavenArtifactProvisionOption mvn = (MavenArtifactProvisionOption) option;
-                if (mvn.getURL().startsWith("mvn:" + groupId + "/" + artifactId + "/")) {
-                    return mvn;
-                }
-            }
-        }
-        return null;
-    }
-
-    private static Properties loadProperties(URL location) {
-        try {
-            Properties props = new Properties();
-            InputStream is = location.openStream();
-            try {
-                props.load(is);
-            } finally {
-                is.close();
-            }
-            return props;
-        } catch (IOException e) {
-            throw new RuntimeException("Unable to load properties from " + location, e);
-        }
-    }
-
-    private static URL getResource(String location) {
-        URL url = null;
-        if (Thread.currentThread().getContextClassLoader() != null) {
-            url = Thread.currentThread().getContextClassLoader().getResource(location);
-        }
-        if (url == null) {
-            url = Helper.class.getResource(location);
-        }
-        if (url == null) {
-            throw new RuntimeException("Unable to find resource " + location);
-        }
-        return url;
-    }
-
-    private static final String DELIM_START = "${";
-    private static final String DELIM_STOP = "}";
-
-    /**
-     * <p>
-     * This method performs property variable substitution on the
-     * specified value. If the specified value contains the syntax
-     * <tt>${&lt;prop-name&gt;}</tt>, where <tt>&lt;prop-name&gt;</tt>
-     * refers to either a configuration property or a system property,
-     * then the corresponding property value is substituted for the variable
-     * placeholder. Multiple variable placeholders may exist in the
-     * specified value as well as nested variable placeholders, which
-     * are substituted from inner most to outer most. Configuration
-     * properties override system properties.
-     * </p>
-     *
-     * @param val         The string on which to perform property substitution.
-     * @param currentKey  The key of the property being evaluated used to
-     *                    detect cycles.
-     * @param cycleMap    Map of variable references used to detect nested cycles.
-     * @param configProps Set of configuration properties.
-     * @return The value of the specified string after system property substitution.
-     * @throws IllegalArgumentException If there was a syntax error in the
-     *                                  property placeholder syntax or a recursive variable reference.
-     */
-    private static String substVars(String val, String currentKey,
-                                    Map<String, String> cycleMap, Properties configProps)
-            throws IllegalArgumentException {
-        // If there is currently no cycle map, then create
-        // one for detecting cycles for this invocation.
-        if (cycleMap == null) {
-            cycleMap = new HashMap<String, String>();
-        }
-
-        // Put the current key in the cycle map.
-        cycleMap.put(currentKey, currentKey);
-
-        // Assume we have a value that is something like:
-        // "leading ${foo.${bar}} middle ${baz} trailing"
-
-        // Find the first ending '}' variable delimiter, which
-        // will correspond to the first deepest nested variable
-        // placeholder.
-        int stopDelim = val.indexOf(DELIM_STOP);
-
-        // Find the matching starting "${" variable delimiter
-        // by looping until we find a start delimiter that is
-        // greater than the stop delimiter we have found.
-        int startDelim = val.indexOf(DELIM_START);
-        while (stopDelim >= 0) {
-            int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length());
-            if ((idx < 0) || (idx > stopDelim)) {
-                break;
-            } else if (idx < stopDelim) {
-                startDelim = idx;
-            }
-        }
-
-        // If we do not have a start or stop delimiter, then just
-        // return the existing value.
-        if ((startDelim < 0) && (stopDelim < 0)) {
-            return val;
-        }
-        // At this point, we found a stop delimiter without a start,
-        // so throw an exception.
-        else if (((startDelim < 0) || (startDelim > stopDelim))
-                && (stopDelim >= 0)) {
-            throw new IllegalArgumentException(
-                    "stop delimiter with no start delimiter: "
-                            + val);
-        }
-
-        // At this point, we have found a variable placeholder so
-        // we must perform a variable substitution on it.
-        // Using the start and stop delimiter indices, extract
-        // the first, deepest nested variable placeholder.
-        String variable =
-                val.substring(startDelim + DELIM_START.length(), stopDelim);
-
-        // Verify that this is not a recursive variable reference.
-        if (cycleMap.get(variable) != null) {
-            throw new IllegalArgumentException(
-                    "recursive variable reference: " + variable);
-        }
-
-        // Get the value of the deepest nested variable placeholder.
-        // Try to configuration properties first.
-        String substValue = (configProps != null)
-                ? configProps.getProperty(variable, null)
-                : null;
-        if (substValue == null) {
-            // Ignore unknown property values.
-            substValue = System.getProperty(variable, "");
-        }
-
-        // Remove the found variable from the cycle map, since
-        // it may appear more than once in the value and we don't
-        // want such situations to appear as a recursive reference.
-        cycleMap.remove(variable);
-
-        // Append the leading characters, the substituted value of
-        // the variable, and the trailing characters to get the new
-        // value.
-        val = val.substring(0, startDelim)
-                + substValue
-                + val.substring(stopDelim + DELIM_STOP.length(), val.length());
-
-        // Now perform substitution again, since there could still
-        // be substitutions to make.
-        val = substVars(val, currentKey, cycleMap, configProps);
-
-        // Return the value.
-        return val;
-    }
-
-    private static MavenArtifactProvisionOption convertToMaven(String location) {
-        String[] p = location.split("/");
-        if (p.length >= 4 && p[p.length-1].startsWith(p[p.length-3] + "-" + p[p.length-2])) {
-            MavenArtifactProvisionOption opt = new MavenArtifactProvisionOption();
-            int artifactIdVersionLength = p[p.length-3].length() + 1 + p[p.length-2].length(); // (artifactId + "-" + version).length
-            if (p[p.length-1].charAt(artifactIdVersionLength) == '-') {
-                opt.classifier((p[p.length-1].substring(artifactIdVersionLength + 1, p[p.length-1].lastIndexOf('.'))));
-            }
-            StringBuffer sb = new StringBuffer();
-            for (int j = 0; j < p.length - 3; j++) {
-                if (j > 0) {
-                    sb.append('.');
-                }
-                sb.append(p[j]);
-            }
-            opt.groupId(sb.toString());
-            opt.artifactId(p[p.length-3]);
-            opt.version(p[p.length-2]);
-            opt.type(p[p.length-1].substring(p[p.length-1].lastIndexOf('.') + 1));
-            return opt;
-        } else {
-            throw new IllegalArgumentException("Unable to extract maven information from " + location);
-        }
-    }
-
-
-    private static String align(String value) {
-        return value != null ? value.replaceAll("\r", "").replaceAll("\n", "").replaceAll(" ", "") : "";
-    }
-
-}
diff --git a/karaf/webconsole/admin/NOTICE b/karaf/webconsole/admin/NOTICE
deleted file mode 100644
index 4493c5b..0000000
--- a/karaf/webconsole/admin/NOTICE
+++ /dev/null
@@ -1,25 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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 from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
-- JSON License
diff --git a/karaf/webconsole/admin/pom.xml b/karaf/webconsole/admin/pom.xml
deleted file mode 100644
index c4107ef..0000000
--- a/karaf/webconsole/admin/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/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-  
-    <parent>
-        <groupId>org.apache.felix.karaf.webconsole</groupId>
-        <artifactId>webconsole</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.webconsole</groupId>
-    <artifactId>org.apache.felix.karaf.webconsole.admin</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Web Console :: Admin Plugin</name>
-  
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</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.felix.karaf.admin</groupId>
-            <artifactId>org.apache.felix.karaf.admin.core</artifactId>
-            <version>${project.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-            <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.logging.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-  
-    <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <configuration>
-          <instructions>
-            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-            <Import-Package>!${project.artifactId}*,*</Import-Package>
-            <Export-Package>${project.artifactId}*;version=${project.version}</Export-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/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java b/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java
deleted file mode 100644
index db54122..0000000
--- a/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java
+++ /dev/null
@@ -1,369 +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.felix.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.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.felix.karaf.admin.AdminService;
-import org.apache.felix.karaf.admin.Instance;
-import org.apache.felix.karaf.admin.InstanceSettings;
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
-import org.json.JSONException;
-import org.json.JSONWriter;
-import org.osgi.framework.BundleContext;
-
-/**
- * Felix Web Console plugin for interacting with the {@link AdminService}
- */
-public class AdminPlugin extends AbstractWebConsolePlugin {
-
-    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 Log log = LogFactory.getLog(AdminPlugin.class);
-    private ClassLoader classLoader;
-
-    /**
-     * 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();
-    }
-
-    @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 port = parsePortNumber(req.getParameter("port"));
-            String location = parseString(req.getParameter("location"));
-            List<String> featureURLs = parseStringList(req.getParameter("featureURLs"));
-            List<String> features = parseStringList(req.getParameter("features"));
-            InstanceSettings settings = new InstanceSettings(port, location, 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.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 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) {
-                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("port");
-        jw.value(instance.getPort());
-        jw.key("state");
-        jw.value(instance.getState());
-        jw.key("location");
-        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/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml b/karaf/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml
deleted file mode 100644
index 696b388..0000000
--- a/karaf/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.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="adminService" interface="org.apache.felix.karaf.admin.AdminService" />
-
-    <bean id="adminPlugin" class="org.apache.felix.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/webconsole/admin/src/main/resources/res/ui/admin.js b/karaf/webconsole/admin/src/main/resources/res/ui/admin.js
deleted file mode 100644
index cc48772..0000000
--- a/karaf/webconsole/admin/src/main/resources/res/ui/admin.js
+++ /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.
- */
-
-function renderAdmin( data ) {
-    $(document).ready( function() {
-        renderView();
-        renderData( data );
-    } );
-}
-
-function renderView() {
-    renderStatusLine();
-    var txt = "<form method='post'><div class='table'><table id='create_instance_table' class='tablelayout'><tbody>" +
-    "<tr><input type='hidden' name='action' value='create'/>" +
-    "<td>Name: <input id='name' type='text' name='name' style='width:70%' colspan='2'/></td>" +
-    "<td>Port: <input id='port' type='text' name='port' style='width:70%' colspan='2'/></td>" +
-    "<td>Location: <input id='location' type='text' name='location' style='width:70%' colspan='2'/></td>" +
-    "<td />" +
-    "</tr><tr><td>Features: <input id='features' type='text' name='features' style='width:70%' colspan='2'" + 
-    " title='Specify initial features separated by commas.'/></td>" + 
-    "<td colspan='2'>Feature URLs: <input id='featureURLs' type='text' name='featureURLs' style='width:80%' colspan='2'" + 
-    " title='Specify additional feature URLs separate by commas.'/></td>" +
-    "<td class='col_Actions'><input type='button' value='Create' onclick='createInstance()'/></td>" +
-    "</tr></tbody></table></div></form><br/>";
-    $("#plugin_content").append( txt );
-    renderTable( "Karaf Instances", "instances_table", ["Pid", "Name", "Port", "State", "Location", "Actions"] );
-    renderStatusLine();
-}
-
-function createInstance() {
-    var name = document.getElementById( "name" ).value;
-    var port = document.getElementById( "port" ).value;
-    var location = document.getElementById( "location" ).value;
-    var features = document.getElementById( "features" ).value;
-    var featureURLs = document.getElementById( "featureURLs" ).value;
-    postCreateInstance( name, port, location, features, featureURLs );
-}
-
-function postCreateInstance( /* String */ name, /* String */ port, /* String */ location, 
-		/* String */ features, /* String */ featureURLs ) {
-    $.post( pluginRoot, {"action": "create", "name": name, "port": port, "location": location, 
-                             "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 = "<div class='table'><table class='tablelayout'><tbody><tr>" +
-    "<td style='color:#6181A9;background-color:#e6eeee'>" +
-    title + "</td></tr></tbody></table>" +
-    "<table id='" + id + "' class='tablelayout'><thead><tr>";
-    for ( var name in columns ) {
-        txt = txt + "<th class='col_" + columns[name] + "' style='border-top:#e6eeee'>" + columns[name] + "</th>";
-    }
-    txt = txt + "</tr></thead><tbody></tbody></table></div>";
-    $("#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.port ) ] ) );
-    parent.appendChild( td( null, null, [ text( instance.state ) ] ) );
-    parent.appendChild( td( null, null, [ text( instance.location ) ] ) );
-    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/webconsole/admin/src/test/java/org/apache/felix/karaf/webconsole/admin/AdminPluginTest.java b/karaf/webconsole/admin/src/test/java/org/apache/felix/karaf/webconsole/admin/AdminPluginTest.java
deleted file mode 100644
index 7bf25a2..0000000
--- a/karaf/webconsole/admin/src/test/java/org/apache/felix/karaf/webconsole/admin/AdminPluginTest.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.felix.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.felix.karaf.admin.AdminService;
-import org.apache.felix.karaf.admin.Instance;
-import org.apache.felix.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(1234, 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("port", "1234");
-        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/webconsole/branding/NOTICE b/karaf/webconsole/branding/NOTICE
deleted file mode 100644
index a2d6256..0000000
--- a/karaf/webconsole/branding/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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.
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
diff --git a/karaf/webconsole/branding/pom.xml b/karaf/webconsole/branding/pom.xml
deleted file mode 100644
index cb3b650..0000000
--- a/karaf/webconsole/branding/pom.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-  
-    <parent>
-        <groupId>org.apache.felix.karaf.webconsole</groupId>
-        <artifactId>webconsole</artifactId>
-        <version>1.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.felix.karaf.webconsole</groupId>
-    <artifactId>org.apache.felix.karaf.webconsole.branding</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.7.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Web Console :: Branding</name>
-
-    <description>Apache Felix 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.
-    </description>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-          <groupId>org.apache.felix</groupId>
-          <artifactId>org.apache.felix.webconsole</artifactId>
-          <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-DocURL>http://felix.apache.org/site/apache-felix-karaf.html</Bundle-DocURL>
-                        <Fragment-Host>org.apache.felix.webconsole;bundle-version="[3,4)"</Fragment-Host>
-                        <Export-Package>!*</Export-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-  
-</project>
\ No newline at end of file
diff --git a/karaf/webconsole/branding/src/main/java/org/apache/felix/karaf/webconsole/JaasSecurityProvider.java b/karaf/webconsole/branding/src/main/java/org/apache/felix/karaf/webconsole/JaasSecurityProvider.java
deleted file mode 100644
index b2a37ba..0000000
--- a/karaf/webconsole/branding/src/main/java/org/apache/felix/karaf/webconsole/JaasSecurityProvider.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.felix.karaf.webconsole;
-
-import java.io.IOException;
-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.LoginContext;
-
-import org.apache.felix.webconsole.WebConsoleSecurityProvider;
-
-public class JaasSecurityProvider implements WebConsoleSecurityProvider {
-
-    private String realm;
-
-    public String getRealm() {
-        return realm;
-    }
-
-    public void setRealm(String realm) {
-        this.realm = realm;
-    }
-
-    public Object authenticate(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();
-            return subject;
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-    public boolean authorize(Object o, String s) {
-        return true;
-    }
-}
diff --git a/karaf/webconsole/branding/src/main/resources/META-INF/webconsole.properties b/karaf/webconsole/branding/src/main/resources/META-INF/webconsole.properties
deleted file mode 100644
index a742b7d..0000000
--- a/karaf/webconsole/branding/src/main/resources/META-INF/webconsole.properties
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing,
-#  software distributed under the License is distributed on an
-#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-#  specific language governing permissions and limitations
-#  under the License.
-#
-
-
-#
-# This file contains branding properties to overwrite the default
-# branding of the Apache Felix Web Console when deployed in an
-# Apache Felix Karaf application.
-
-webconsole.product.name = Apache Felix Karaf
-webconsole.product.url = http://felix.apache.org/site/apache-felix-karaf.html
-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/webconsole/branding/src/main/resources/OSGI-INF/blueprint/webconsole.xml b/karaf/webconsole/branding/src/main/resources/OSGI-INF/blueprint/webconsole.xml
deleted file mode 100644
index 4bdbc87..0000000
--- a/karaf/webconsole/branding/src/main/resources/OSGI-INF/blueprint/webconsole.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"
-           xmlns:bp="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="]"/>
-
-    <cm:property-placeholder persistent-id="org.apache.felix.karaf.webconsole">
-        <cm:default-properties>
-            <cm:property name="realm" value="karaf"/>
-        </cm:default-properties>
-    </cm:property-placeholder>
-
-    <bean id="securityProvider" class="org.apache.felix.karaf.webconsole.JaasSecurityProvider">
-        <property name="realm" value="${realm}"/>
-    </bean>
-
-    <service auto-export="interfaces" ref="securityProvider" />
-
-</blueprint>
diff --git a/karaf/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.properties
deleted file mode 100644
index 9f27442..0000000
--- a/karaf/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 Felix Karaf WebConsole
-webconsole.description = Configuration of Apache Felix Karaf WebConsole
-
-realm.name = Realm
-realm.description = The JAAS realm name to use for authentication
diff --git a/karaf/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.xml
deleted file mode 100644
index 2e0a845..0000000
--- a/karaf/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.felix.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.felix.karaf.webconsole">
-        <Object ocdref="org.apache.felix.karaf.webconsole"/>
-    </Designate>
-</metatype:MetaData>
diff --git a/karaf/webconsole/branding/src/main/resources/res/karaf/imgs/favicon.ico b/karaf/webconsole/branding/src/main/resources/res/karaf/imgs/favicon.ico
deleted file mode 100644
index c37dbe8..0000000
--- a/karaf/webconsole/branding/src/main/resources/res/karaf/imgs/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/karaf/webconsole/branding/src/main/resources/res/karaf/imgs/logo.png b/karaf/webconsole/branding/src/main/resources/res/karaf/imgs/logo.png
deleted file mode 100644
index bd24038..0000000
--- a/karaf/webconsole/branding/src/main/resources/res/karaf/imgs/logo.png
+++ /dev/null
Binary files differ
diff --git a/karaf/webconsole/branding/src/main/resources/res/karaf/ui/webconsole.css b/karaf/webconsole/branding/src/main/resources/res/karaf/ui/webconsole.css
deleted file mode 100644
index ea9b12f..0000000
--- a/karaf/webconsole/branding/src/main/resources/res/karaf/ui/webconsole.css
+++ /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.
- */
-
-/*
- * 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 */
-}
-
-
-/* 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 {
-	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
-}
diff --git a/karaf/webconsole/features/NOTICE b/karaf/webconsole/features/NOTICE
deleted file mode 100644
index 4493c5b..0000000
--- a/karaf/webconsole/features/NOTICE
+++ /dev/null
@@ -1,25 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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 from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
-- JSON License
diff --git a/karaf/webconsole/features/pom.xml b/karaf/webconsole/features/pom.xml
deleted file mode 100644
index 8c43abe..0000000
--- a/karaf/webconsole/features/pom.xml
+++ /dev/null
@@ -1,105 +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/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-  <modelVersion>4.0.0</modelVersion>
-  
-  <parent>
-      <groupId>org.apache.felix.karaf.webconsole</groupId>
-      <artifactId>webconsole</artifactId>
-      <version>1.7.0-SNAPSHOT</version>
-  </parent>
-
-  <groupId>org.apache.felix.karaf.webconsole</groupId>
-  <artifactId>org.apache.felix.karaf.webconsole.features</artifactId>
-  <packaging>bundle</packaging>
-  <version>1.7.0-SNAPSHOT</version>
-  <name>Apache Felix Karaf :: Web Console :: Features Plugin</name>
-  
-  <properties>
-      <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.osgi.core</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.felix</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>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.felix.karaf.features</groupId>
-      <artifactId>org.apache.felix.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>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <configuration>
-          <instructions>
-            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-            <Import-Package>!${project.artifactId}*,*</Import-Package>
-            <Export-Package>${project.artifactId}*;version=${project.version}</Export-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/webconsole/features/src/main/java/org/apache/felix/karaf/webconsole/features/ExtendedFeature.java b/karaf/webconsole/features/src/main/java/org/apache/felix/karaf/webconsole/features/ExtendedFeature.java
deleted file mode 100644
index 3cac3a4..0000000
--- a/karaf/webconsole/features/src/main/java/org/apache/felix/karaf/webconsole/features/ExtendedFeature.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.felix.karaf.webconsole.features;
-
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.felix.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<String> getBundles()
-    {
-        return this.feature.getBundles();
-    }
-
-
-    public Map<String, Map<String, String>> getConfigurations()
-    {
-        return this.feature.getConfigurations();
-    }
-
-
-    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();
-    }
-
-
-    //
-    // Additional methods
-    //
-
-
-    public String getRepository() {
-        return this.repository;
-    }
-
-
-    public State getState() {
-        return this.state;
-    }
-}
diff --git a/karaf/webconsole/features/src/main/java/org/apache/felix/karaf/webconsole/features/FeaturesPlugin.java b/karaf/webconsole/features/src/main/java/org/apache/felix/karaf/webconsole/features/FeaturesPlugin.java
deleted file mode 100644
index a68f44f..0000000
--- a/karaf/webconsole/features/src/main/java/org/apache/felix/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.felix.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.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.felix.karaf.features.Feature;
-import org.apache.felix.karaf.features.FeaturesService;
-import org.apache.felix.karaf.features.Repository;
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
-import org.json.JSONException;
-import org.json.JSONWriter;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * The <code>FeaturesPlugin</code>
- */
-public class FeaturesPlugin extends AbstractWebConsolePlugin
-{
-
-    /** Pseudo class version ID to keep the IDE quite. */
-    private static final long serialVersionUID = 1L;
-
-    public static final String NAME = "features";
-
-    public static final String LABEL = "Features";
-
-    private Log log = LogFactory.getLog(FeaturesPlugin.class);
-
-    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/webconsole/features/src/main/resources/OSGI-INF/blueprint/webconsole-features.xml b/karaf/webconsole/features/src/main/resources/OSGI-INF/blueprint/webconsole-features.xml
deleted file mode 100644
index b009592..0000000
--- a/karaf/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.felix.karaf.features.FeaturesService" />
-
-    <bean id="featuresPlugin" class="org.apache.felix.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/webconsole/features/src/main/resources/res/ui/features.js b/karaf/webconsole/features/src/main/resources/res/ui/features.js
deleted file mode 100644
index 3bfc2e4..0000000
--- a/karaf/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'><div class='table'><table id='repository_table_footer' class='tablelayout'><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></div></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='table'><table class='tablelayout'><tbody><tr>" +
-        "<td style='color:#6181A9;background-color:#e6eeee'>" +
-        title + "</td></tr></tbody></table>" +
-        "<table id='" + id + "' class='tablelayout'><thead><tr>";
-    for ( var name in columns ) {
-      txt = txt + "<th class='col_" + columns[name] + "' style='border-top:#e6eeee'>" + columns[name] + "</th>";
-    }
-    txt = txt + "</tr></thead><tbody></tbody></table></div>";
-    $("#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/webconsole/gogo/NOTICE b/karaf/webconsole/gogo/NOTICE
deleted file mode 100644
index 46a8a29..0000000
--- a/karaf/webconsole/gogo/NOTICE
+++ /dev/null
@@ -1,30 +0,0 @@
-Apache Felix Karaf
-Copyright 2010 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 from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-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.
-
-
-III. License Summary
-- Apache License 2.0
-- JSON License
-- Public Domain
diff --git a/karaf/webconsole/gogo/pom.xml b/karaf/webconsole/gogo/pom.xml
deleted file mode 100644
index 802cae6..0000000
--- a/karaf/webconsole/gogo/pom.xml
+++ /dev/null
@@ -1,105 +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/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-  <modelVersion>4.0.0</modelVersion>
-  
-  <parent>
-      <groupId>org.apache.felix.karaf.webconsole</groupId>
-      <artifactId>webconsole</artifactId>
-      <version>1.7.0-SNAPSHOT</version>
-  </parent>
-
-  <groupId>org.apache.felix.karaf.webconsole</groupId>
-  <artifactId>org.apache.felix.karaf.webconsole.gogo</artifactId>
-  <packaging>bundle</packaging>
-  <version>1.7.0-SNAPSHOT</version>
-  <name>Apache Felix Karaf :: Web Console :: Gogo Plugin</name>
-  
-  <properties>
-      <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.osgi.core</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.felix</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>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.felix.karaf.shell</groupId>
-      <artifactId>org.apache.felix.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>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <configuration>
-          <instructions>
-            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-            <Import-Package>!${project.artifactId}*,*</Import-Package>
-            <Export-Package>${project.artifactId}*;version=${project.version}</Export-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/webconsole/gogo/src/main/java/org/apache/felix/karaf/webconsole/gogo/GogoPlugin.java b/karaf/webconsole/gogo/src/main/java/org/apache/felix/karaf/webconsole/gogo/GogoPlugin.java
deleted file mode 100644
index bed29dc..0000000
--- a/karaf/webconsole/gogo/src/main/java/org/apache/felix/karaf/webconsole/gogo/GogoPlugin.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.felix.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.List;
-import java.util.concurrent.Callable;
-import java.util.zip.GZIPOutputStream;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.felix.karaf.shell.console.Completer;
-import org.apache.felix.karaf.shell.console.completer.AggregateCompleter;
-import org.apache.felix.karaf.shell.console.jline.Console;
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.command.CommandProcessor;
-import org.osgi.service.command.CommandSession;
-
-/**
- * The <code>GogoPlugin</code>
- */
-public class GogoPlugin extends AbstractWebConsolePlugin {
-
-    /** Pseudo class version ID to keep the IDE quite. */
-    private static final long serialVersionUID = 1L;
-
-    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 Log log = LogFactory.getLog(GogoPlugin.class);
-
-    private BundleContext bundleContext;
-
-    private CommandProcessor commandProcessor;
-
-    private List<Completer> completers;
-
-    public void setBundleContext(BundleContext bundleContext)
-    {
-        this.bundleContext = bundleContext;
-    }
-
-    public void setCommandProcessor(CommandProcessor commandProcessor)
-    {
-        this.commandProcessor = commandProcessor;
-    }
-
-    public void setCompleters(List<Completer> completers)
-    {
-        this.completers = completers;
-    }
-
-    /*
-    * Blueprint lifecycle callback methods
-    */
-
-    public void start()
-    {
-        super.activate( bundleContext );
-        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 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.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;
-    }
-
-    @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),
-                                      new AggregateCompleter(completers),
-                                      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/webconsole/gogo/src/main/java/org/apache/felix/karaf/webconsole/gogo/Terminal.java b/karaf/webconsole/gogo/src/main/java/org/apache/felix/karaf/webconsole/gogo/Terminal.java
deleted file mode 100644
index 661d1f9..0000000
--- a/karaf/webconsole/gogo/src/main/java/org/apache/felix/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.felix.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_saved = 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) {
-                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/webconsole/gogo/src/main/java/org/apache/felix/karaf/webconsole/gogo/WebTerminal.java b/karaf/webconsole/gogo/src/main/java/org/apache/felix/karaf/webconsole/gogo/WebTerminal.java
deleted file mode 100644
index 550cb03..0000000
--- a/karaf/webconsole/gogo/src/main/java/org/apache/felix/karaf/webconsole/gogo/WebTerminal.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.karaf.webconsole.gogo;
-
-import java.io.InputStreamReader;
-import java.io.InputStream;
-import java.io.IOException;
-
-public class WebTerminal extends jline.Terminal {
-
-    public static final short ARROW_START = 27;
-    public static final short ARROW_PREFIX = 91;
-    public static final short ARROW_LEFT = 68;
-    public static final short ARROW_RIGHT = 67;
-    public static final short ARROW_UP = 65;
-    public static final short ARROW_DOWN = 66;
-    public static final short O_PREFIX = 79;
-    public static final short HOME_CODE = 72;
-    public static final short END_CODE = 70;
-
-    public static final short DEL_THIRD = 51;
-    public static final short DEL_SECOND = 126;
-
-    private int width;
-    private int height;
-    private boolean backspaceDeleteSwitched = false;
-    private String encoding = System.getProperty("input.encoding", "UTF-8");
-    private ReplayPrefixOneCharInputStream replayStream = new ReplayPrefixOneCharInputStream(encoding);
-    private InputStreamReader replayReader;
-
-    public WebTerminal(int width, int height) {
-        this.width = width;
-        this.height = height;
-        try {
-            replayReader = new InputStreamReader(replayStream, encoding);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public void initializeTerminal() throws Exception {
-    }
-
-    public void restoreTerminal() throws Exception {
-    }
-
-    public int getTerminalWidth() {
-        return width;
-    }
-
-    public int getTerminalHeight() {
-        return height;
-    }
-
-    public boolean isSupported() {
-        return true;
-    }
-
-    public boolean getEcho() {
-        return false;
-    }
-
-    public boolean isEchoEnabled() {
-        return false;
-    }
-
-    public void enableEcho() {
-    }
-
-    public void disableEcho() {
-    }
-
-    public int readVirtualKey(InputStream in) throws IOException {
-        int c = readCharacter(in);
-
-        if (backspaceDeleteSwitched) {
-            if (c == DELETE) {
-                c = '\b';
-            } else if (c == '\b') {
-                c = DELETE;
-            }
-        }
-
-        // in Unix terminals, arrow keys are represented by
-        // a sequence of 3 characters. E.g., the up arrow
-        // key yields 27, 91, 68
-        if (c == ARROW_START) {
-            //also the escape key is 27
-            //thats why we read until we
-            //have something different than 27
-            //this is a bugfix, because otherwise
-            //pressing escape and than an arrow key
-            //was an undefined state
-            while (c == ARROW_START) {
-                c = readCharacter(in);
-            }
-            if (c == ARROW_PREFIX || c == O_PREFIX) {
-                c = readCharacter(in);
-                if (c == ARROW_UP) {
-                    return CTRL_P;
-                } else if (c == ARROW_DOWN) {
-                    return CTRL_N;
-                } else if (c == ARROW_LEFT) {
-                    return CTRL_B;
-                } else if (c == ARROW_RIGHT) {
-                    return CTRL_F;
-                } else if (c == HOME_CODE) {
-                    return CTRL_A;
-                } else if (c == END_CODE) {
-                    return CTRL_E;
-                } else if (c == DEL_THIRD) {
-                    c = readCharacter(in); // read 4th
-                    return DELETE;
-                }
-            }
-        }
-        // handle unicode characters, thanks for a patch from amyi@inf.ed.ac.uk
-        if (c > 128) {
-          // handle unicode characters longer than 2 bytes,
-          // thanks to Marc.Herbert@continuent.com
-            replayStream.setInput(c, in);
-            c = replayReader.read();
-        }
-
-        return c;
-    }
-
-    /**
-     * This is awkward and inefficient, but probably the minimal way to add
-     * UTF-8 support to JLine
-     *
-     * @author <a href="mailto:Marc.Herbert@continuent.com">Marc Herbert</a>
-     */
-    static class ReplayPrefixOneCharInputStream extends InputStream {
-
-        byte firstByte;
-        int byteLength;
-        InputStream wrappedStream;
-        int byteRead;
-
-        final String encoding;
-
-        public ReplayPrefixOneCharInputStream(String encoding) {
-            this.encoding = encoding;
-        }
-
-        public void setInput(int recorded, InputStream wrapped) throws IOException {
-            this.byteRead = 0;
-            this.firstByte = (byte) recorded;
-            this.wrappedStream = wrapped;
-
-            byteLength = 1;
-            if (encoding.equalsIgnoreCase("UTF-8")) {
-                setInputUTF8(recorded, wrapped);
-            } else if (encoding.equalsIgnoreCase("UTF-16")) {
-                byteLength = 2;
-            } else if (encoding.equalsIgnoreCase("UTF-32")) {
-                byteLength = 4;
-            }
-        }
-
-
-        public void setInputUTF8(int recorded, InputStream wrapped) throws IOException {
-            // 110yyyyy 10zzzzzz
-            if ((firstByte & (byte) 0xE0) == (byte) 0xC0) {
-                this.byteLength = 2;
-            // 1110xxxx 10yyyyyy 10zzzzzz
-            } else if ((firstByte & (byte) 0xF0) == (byte) 0xE0) {
-                this.byteLength = 3;
-            // 11110www 10xxxxxx 10yyyyyy 10zzzzzz
-            } else if ((firstByte & (byte) 0xF8) == (byte) 0xF0) {
-                this.byteLength = 4;
-            } else {
-                throw new IOException("invalid UTF-8 first byte: " + firstByte);
-            }
-        }
-
-        public int read() throws IOException {
-            if (available() == 0) {
-                return -1;
-            }
-
-            byteRead++;
-
-            if (byteRead == 1) {
-                return firstByte;
-            }
-
-            return wrappedStream.read();
-        }
-
-        /**
-        * InputStreamReader is greedy and will try to read bytes in advance. We
-        * do NOT want this to happen since we use a temporary/"losing bytes"
-        * InputStreamReader above, that's why we hide the real
-        * wrappedStream.available() here.
-        */
-        public int available() {
-            return byteLength - byteRead;
-        }
-    }
-
-}
diff --git a/karaf/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml b/karaf/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml
deleted file mode 100644
index de8770a..0000000
--- a/karaf/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml
+++ /dev/null
@@ -1,51 +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="commandProcessor" interface="org.osgi.service.command.CommandProcessor" />
-
-    <bean id="gogoPlugin" class="org.apache.felix.karaf.webconsole.gogo.GogoPlugin" init-method="start" destroy-method="stop">
-        <property name="completers">
-            <list>
-                <ref component-id="commandCompleter"/>
-            </list>
-        </property>
-        <property name="commandProcessor" ref="commandProcessor" />
-        <property name="bundleContext" ref="blueprintBundleContext" />
-    </bean>
-
-    <reference-list id="functions" filter="(&amp;(osgi.command.scope=*)(osgi.command.function=*))" availability="optional">
-        <reference-listener ref="commandCompleter"
-                            bind-method="register"
-                            unbind-method="unregister"/>
-    </reference-list>
-
-    <bean id="commandCompleter" class="org.apache.felix.karaf.shell.console.completer.CommandsCompleter">
-        <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/webconsole/gogo/src/main/resources/res/ui/gogo.css b/karaf/webconsole/gogo/src/main/resources/res/ui/gogo.css
deleted file mode 100644
index b15ece8..0000000
--- a/karaf/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/webconsole/gogo/src/main/resources/res/ui/gogo.js b/karaf/webconsole/gogo/src/main/resources/res/ui/gogo.js
deleted file mode 100644
index 771efe0..0000000
--- a/karaf/webconsole/gogo/src/main/resources/res/ui/gogo.js
+++ /dev/null
@@ -1,246 +0,0 @@
-//
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT 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 ie = (window.ActiveXObject) ? 0 : 1;
-   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) {
-        // Translate to standard keycodes
-        if (!ev)
-            ev = window.event;
-        var kc;
-        if (ev.keyCode)
-            kc = ev.keyCode;
-        if (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 (ev.which == 0) {
-            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;
-            }
-        }
-        if (kc == 8)
-            kc = 127;
-
-        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;
-        }
-        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;
-       if (ie) {
-           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) {
-               ev.which = 0;
-               return keypress(ev);
-           }
-       }
-   }
-
-   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/webconsole/pom.xml b/karaf/webconsole/pom.xml
deleted file mode 100644
index e8da6bc..0000000
--- a/karaf/webconsole/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/maven-v4_0_0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-  <modelVersion>4.0.0</modelVersion>
-  
-  <parent>
-    <groupId>org.apache.felix.karaf</groupId>
-    <artifactId>karaf</artifactId>
-    <version>1.7.0-SNAPSHOT</version>
-  </parent>
-
-  <groupId>org.apache.felix.karaf.webconsole</groupId>
-  <artifactId>webconsole</artifactId>
-  <packaging>pom</packaging>
-  <version>1.7.0-SNAPSHOT</version>
-  <name>Apache Felix Karaf :: Web Console</name>
-  
-  <modules>
-    <module>features</module>
-    <module>gogo</module>
-    <module>branding</module>
-    <module>admin</module>
-  </modules>
-  
-</project>
