diff --git a/maven-obr-plugin/LICENSE b/maven-obr-plugin/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/maven-obr-plugin/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/maven-obr-plugin/LICENSE.kxml2 b/maven-obr-plugin/LICENSE.kxml2
deleted file mode 100644
index 1fe595b..0000000
--- a/maven-obr-plugin/LICENSE.kxml2
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
-
-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. 
diff --git a/maven-obr-plugin/NOTICE b/maven-obr-plugin/NOTICE
deleted file mode 100644
index 9730d77..0000000
--- a/maven-obr-plugin/NOTICE
+++ /dev/null
@@ -1,39 +0,0 @@
-Apache Felix OBR Maven Plugin
-Copyright 2007-2008 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 OSGi Alliance (http://www.osgi.org/).
-Copyright 2006-2008 The OSGi Alliance.
-Licensed under the Apache License 2.0.
-
-
-II. Used Software
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright 2006-2008 The OSGi Alliance.
-Licensed under the Apache License 2.0.
-
-This product uses software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
-
-This product uses software developed at
-The Codehaus (http://www.codehaus.org)
-Licensed under the Apache License 2.0.
-
-This product uses software from http://kxml.sourceforge.net.
-Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany.
-Licensed under the BSD License.
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
diff --git a/maven-obr-plugin/doc/maven-obr-plugin.html b/maven-obr-plugin/doc/maven-obr-plugin.html
deleted file mode 100644
index a36af1b..0000000
--- a/maven-obr-plugin/doc/maven-obr-plugin.html
+++ /dev/null
@@ -1,285 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title>Apache Felix - Maven OBR Plugin</title>
-
-
-  
-    
-    <link rel="stylesheet" href="maven-obr-plugin_files/site.css" type="text/css" media="all">
-    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"></head><body>
-    <div class="title"><div class="logo"><a href="http://felix.apache.org/site/index.html"><img alt="Apache Felix" src="maven-obr-plugin_files/logo.png" border="0"></a></div><div class="header"><a href="http://www.apache.org/"><img alt="Apache" src="maven-obr-plugin_files/apache.png" border="0"></a></div></div>
-    <div class="menu">
-<ul>
-	<li><a href="http://felix.apache.org/site/index.html" title="Index">home</a></li>
-	<li><a href="http://felix.apache.org/site/news.html" title="news">news</a></li>
-	<li><a href="http://felix.apache.org/site/status.html" title="status">status</a></li>
-	<li><a href="http://felix.apache.org/site/license.html" title="license">license</a></li>
-	<li><span class="nobr"><a href="http://felix.apache.org/site/downloads.cgi" title="Visit page outside Confluence" rel="nofollow">downloads<sup><img class="rendericon" src="maven-obr-plugin_files/linkext7.gif" alt="" align="absmiddle" border="0" height="7" width="7"></sup></a></span></li>
-	<li><a href="http://felix.apache.org/site/documentation.html" title="documentation">documentation</a></li>
-	<li><a href="http://felix.apache.org/site/mailinglists.html" title="mailinglists">mailing lists</a></li>
-	<li><span class="nobr"><a href="http://cwiki.apache.org/confluence/x/O-" title="Visit page outside Confluence" rel="nofollow">wiki<sup><img class="rendericon" src="maven-obr-plugin_files/linkext7.gif" alt="" align="absmiddle" border="0" height="7" width="7"></sup></a></span></li>
-	<li><a href="http://felix.apache.org/site/committers.html" title="committers">committers</a></li>
-	<li><a href="http://felix.apache.org/site/faq.html" title="faq">faq</a></li>
-	<li><a href="http://felix.apache.org/site/roadmap.html" title="roadmap">roadmap</a></li>
-	<li><a href="http://felix.apache.org/site/sourcecode.html" title="sourcecode">source code</a></li>
-	<li><a href="http://felix.apache.org/site/codingstandards.html" title="codingstandards">coding standards</a></li>
-	<li><a href="http://felix.apache.org/site/issuetracking.html" title="issuetracking">issue tracking</a></li>
-	<li><a href="http://felix.apache.org/site/dependencies.html" title="dependencies">dependencies</a></li>
-	<li><span class="nobr"><a href="http://www.apache.org/" title="Visit page outside Confluence" rel="nofollow">apache software foundation<sup><img class="rendericon" src="maven-obr-plugin_files/linkext7.gif" alt="" align="absmiddle" border="0" height="7" width="7"></sup></a></span></li>
-	<li><span class="nobr"><a href="http://www.apache.org/foundation/sponsorship.html" title="Visit page outside Confluence" rel="nofollow">sponsorship<sup><img class="rendericon" src="maven-obr-plugin_files/linkext7.gif" alt="" align="absmiddle" border="0" height="7" width="7"></sup></a></span></li>
-	<li><span class="nobr"><a href="http://www.apache.org/foundation/thanks.html" title="Visit page outside Confluence" rel="nofollow">sponsors<sup><img class="rendericon" src="maven-obr-plugin_files/linkext7.gif" alt="" align="absmiddle" border="0" height="7" width="7"></sup></a></span></li>
-</ul> </div>
-    <div class="main">
-<p>This Maven plug-in aims to automate OBR (OSGi Bundle Repository)
-management. It helps manage a local OBR for your local Maven
-repository, and also supports remote OBRs for bundle distribution. The
-plug-in automatically computes bundle capabilities and requirements,
-using a combination of Bindex and Maven metadata.</p>
-
-<h2><a name="MavenOBRPlugin-Features"></a>Features</h2>
-
-<p>The maven-obr-plugin supports:</p>
-
-<ul>
-	<li>Management of both local and remote OBRs</li>
-	<li>Registering Maven and non-Maven artifacts with OBRs</li>
-	<li>Automatically discovering bundle capabilities and requirements</li>
-	<li>Customizing bundle descriptions</li>
-</ul>
-
-
-<h2><a name="MavenOBRPlugin-Howtousethemavenobrplugin?"></a>How to use the maven-obr-plugin?</h2>
-
-<p>The plug-in offers five Maven goals:</p>
-
-<ul>
-	<li><b>install</b>       adds the current bundle project to the local OBR</li>
-	<li><b>install-file</b>  adds a local bundle file to the local OBR</li>
-	<li><b>deploy</b>        adds the current bundle project to a remote OBR</li>
-	<li><b>deploy-file</b>   adds a local bundle file to a remote OBR</li>
-	<li><b>clean</b>         cleans the local OBR, removing missing bundles</li>
-</ul>
-
-
-<p>Any of these goals can be disabled by setting <tt>-DobrRepository=NONE</tt></p>
-
-<h2><a name="MavenOBRPlugin-obr:install"></a>obr:install</h2>
-
-<p>The <b>install</b> goal updates the local OBR with the details of the installed bundle from the local Maven repository.</p>
-
-<p>(If the project has an <tt>obr.xml</tt> file somewhere in its resources, then it will be automatically detected and applied.)</p>
-
-<p>configuration:</p>
-
-<ul>
-	<li><em>obrRepository</em>  path to local OBR, defaults to <em>&lt;local-maven-repository&gt;</em><tt>/repository.xml</tt></li>
-</ul>
-
-
-<p>To attach this goal to your project's lifecycle, use:</p>
-
-<div class="code"><div class="codeContent">
-<pre class="code-xml"><span class="code-tag">&lt;plugin&gt;</span>
-  <span class="code-tag">&lt;groupId&gt;</span>org.apache.felix<span class="code-tag">&lt;/groupId&gt;</span>
-  <span class="code-tag">&lt;artifactId&gt;</span>maven-obr-plugin<span class="code-tag">&lt;/artifactId&gt;</span>
-  <span class="code-tag">&lt;version&gt;</span>1.2.0<span class="code-tag">&lt;/version&gt;</span>
-  <span class="code-tag">&lt;executions&gt;</span>
-    <span class="code-tag">&lt;execution&gt;</span>
-      <span class="code-tag">&lt;goals&gt;</span>
-        <span class="code-tag">&lt;goal&gt;</span>install<span class="code-tag">&lt;/goal&gt;</span>
-      <span class="code-tag">&lt;/goals&gt;</span>
-    <span class="code-tag">&lt;/execution&gt;</span>
-  <span class="code-tag">&lt;/executions&gt;</span>
-<span class="code-tag">&lt;/plugin&gt;</span></pre>
-</div></div>
-
-<h2><a name="MavenOBRPlugin-obr:installfile"></a>obr:install-file</h2>
-
-<p>The <b>install-file</b> goal updates the local OBR with the details of a bundle from the local filesystem.</p>
-
-<p>configuration:</p>
-
-<ul>
-	<li><em>obrRepository</em>  path to local OBR, defaults to <em>&lt;local-maven-repository&gt;</em><tt>/repository.xml</tt></li>
-	<li><em>groupId</em>        Maven groupId for the bundle, taken from <em>pomFile</em> if given</li>
-	<li><em>artifactId</em>     Maven artifactId for the bundle, taken from <em>pomFile</em> if given</li>
-	<li><em>version</em>        Maven version for the bundle, taken from <em>pomFile</em> if given</li>
-	<li><em>packaging</em>      Maven packaging type for the bundle, taken from <em>pomFile</em> if given</li>
-	<li><em>classifier</em>     Maven classifier type, defaults to none</li>
-	<li><em>pomFile</em>        optional Pom file describing the bundle</li>
-	<li><em>file</em>           bundle file, defaults to the bundle from the local Maven repository</li>
-	<li><em>obrXml</em>         optional additional properties for the bundle</li>
-</ul>
-
-
-<p>Example:</p>
-
-<div class="preformatted"><div class="preformattedContent">
-<pre>mvn org.apache.felix:maven-obr-plugin:1.2.0:install-file \
-  -DpomFile=myPom.xml -Dfile=foo-1.0.jar
-</pre>
-</div></div>
-
-<h2><a name="MavenOBRPlugin-obr:deploy"></a>obr:deploy</h2>
-
-<p>The <b>deploy goal</b> updates the remote OBR with the details of
-the deployed bundle from the local Maven repository. The remote OBR is
-found by querying the <tt>&lt;distributionManagement&gt;</tt> section of the project, unless <tt>-DaltDeploymentRepository</tt> is set. See <span class="nobr"><a href="http://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html" title="Visit page outside Confluence" rel="nofollow">http://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html<sup><img class="rendericon" src="maven-obr-plugin_files/linkext7.gif" alt="" align="absmiddle" border="0" height="7" width="7"></sup></a></span> for more details about these particular settings.</p>
-
-<p>(If the project has an <tt>obr.xml</tt> file somewhere in its resources, then it will be automatically detected and applied.)</p>
-
-<p>configuration:</p>
-
-<ul>
-	<li><em>obrRepository</em>             name of remote OBR, defaults to <tt>repository.xml</tt></li>
-	<li><em>altDeploymentRepository</em>   alternative remote repository, <em>id::layout::url</em></li>
-	<li><em>ignoreLock</em>                ignore remote locking when updating the OBR</li>
-</ul>
-
-
-<p>To attach this goal to your project's lifecycle, use:</p>
-
-<div class="code"><div class="codeContent">
-<pre class="code-xml"><span class="code-tag">&lt;plugin&gt;</span>
-  <span class="code-tag">&lt;groupId&gt;</span>org.apache.felix<span class="code-tag">&lt;/groupId&gt;</span>
-  <span class="code-tag">&lt;artifactId&gt;</span>maven-obr-plugin<span class="code-tag">&lt;/artifactId&gt;</span>
-  <span class="code-tag">&lt;version&gt;</span>1.2.0<span class="code-tag">&lt;/version&gt;</span>
-  <span class="code-tag">&lt;executions&gt;</span>
-    <span class="code-tag">&lt;execution&gt;</span>
-      <span class="code-tag">&lt;goals&gt;</span>
-        <span class="code-tag">&lt;goal&gt;</span>deploy<span class="code-tag">&lt;/goal&gt;</span>
-      <span class="code-tag">&lt;/goals&gt;</span>
-    <span class="code-tag">&lt;/execution&gt;</span>
-  <span class="code-tag">&lt;/executions&gt;</span>
-<span class="code-tag">&lt;/plugin&gt;</span></pre>
-</div></div>
-
-<h2><a name="MavenOBRPlugin-obr:deployfile"></a>obr:deploy-file</h2>
-
-<p>The <b>deploy-file</b> goal updates the remote OBR with the details of a deployed bundle from the local filesystem. The remote OBR is found using the <tt>-DrepositoryId</tt> and <tt>-Durl</tt> parameters. See <span class="nobr"><a href="http://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html" title="Visit page outside Confluence" rel="nofollow">http://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html<sup><img class="rendericon" src="maven-obr-plugin_files/linkext7.gif" alt="" align="absmiddle" border="0" height="7" width="7"></sup></a></span> for more details about these particular settings.</p>
-
-<p>You can use the <tt>-DbundleUrl</tt> parameter to give the public location of the deployed bundle, which may differ from the remote OBR location.</p>
-
-<p>configuration:</p>
-
-<ul>
-	<li><em>obrRepository</em>  name of remote OBR, defaults to <tt>repository.xml</tt></li>
-	<li><em>repositoryId</em>   optional repository id, used to lookup authentication settings</li>
-	<li><em>url</em>            remote repository transport URL, like <div class="preformatted"><div class="preformattedContent">
-<pre>scpexe://host/path/to/obr</pre>
-</div></div></li>
-	<li><em>bundleUrl</em>      public URL of deployed bundle, like <div class="preformatted"><div class="preformattedContent">
-<pre>http://www.foo.org/bundles/foo.jar</pre>
-</div></div></li>
-	<li><em>groupId</em>        Maven groupId for the bundle, taken from <em>pomFile</em> if given</li>
-	<li><em>artifactId</em>     Maven artifactId for the bundle, taken from <em>pomFile</em> if given</li>
-	<li><em>version</em>        Maven version for the bundle, taken from <em>pomFile</em> if given</li>
-	<li><em>packaging</em>      Maven packaging type for the bundle, taken from <em>pomFile</em> if given</li>
-	<li><em>classifier</em>     Maven classifier type, defaults to none</li>
-	<li><em>pomFile</em>        optional Pom file describing the bundle</li>
-	<li><em>file</em>           bundle file, defaults to the bundle from the local Maven repository</li>
-	<li><em>obrXml</em>         optional additional properties for the bundle</li>
-	<li><em>ignoreLock</em>     ignore remote locking when updating the OBR</li>
-</ul>
-
-
-<p>Example:</p>
-
-<div class="preformatted"><div class="preformattedContent">
-<pre>mvn org.apache.felix:maven-obr-plugin:1.2.0:deploy-file \
-  -DpomFile=myPom.xml -Dfile=foo-1.0.jar -Durl=file:/tmp/example/OBR \
-  -DbundleUrl=http://www.foo.org/bundles/foo.jar
-</pre>
-</div></div>
-
-<h2><a name="MavenOBRPlugin-obr:clean"></a>obr:clean</h2>
-
-<p>Sometimes you would like to clean your local OBR because it contains
-bundles that are no longer in your local Maven repository. This case
-often occurs when artifacts were deleted manually. The maven-obr-plugin
-provides a simple goal to check for missing bundles, and remove them
-from the local OBR.</p>
-
-<p>configuration:</p>
-
-<ul>
-	<li><em>obrRepository</em>  path to local OBR, defaults to <em>&lt;local-maven-repository&gt;<tt></tt></em><tt>/repository.xml</tt></li>
-</ul>
-
-
-<p>To attach this goal to your project's lifecycle, use:</p>
-
-<div class="code"><div class="codeContent">
-<pre class="code-xml"><span class="code-tag">&lt;plugin&gt;</span>
-  <span class="code-tag">&lt;groupId&gt;</span>org.apache.felix<span class="code-tag">&lt;/groupId&gt;</span>
-  <span class="code-tag">&lt;artifactId&gt;</span>maven-obr-plugin<span class="code-tag">&lt;/artifactId&gt;</span>
-  <span class="code-tag">&lt;version&gt;</span>1.2.0<span class="code-tag">&lt;/version&gt;</span>
-  <span class="code-tag">&lt;executions&gt;</span>
-    <span class="code-tag">&lt;execution&gt;</span>
-      <span class="code-tag">&lt;goals&gt;</span>
-        <span class="code-tag">&lt;goal&gt;</span>clean<span class="code-tag">&lt;/goal&gt;</span>
-      <span class="code-tag">&lt;/goals&gt;</span>
-    <span class="code-tag">&lt;/execution&gt;</span>
-  <span class="code-tag">&lt;/executions&gt;</span>
-<span class="code-tag">&lt;/plugin&gt;</span></pre>
-</div></div>
-
-<h2><a name="MavenOBRPlugin-Concurrentupdates"></a>Concurrent updates</h2>
-
-<p>With a remote OBR, several uploads may occur at the same time.
-However, the remote OBR is centralized in one file, so concurrent
-modification must be avoided. To achieve this, the plug-in implements a
-locking system. Each time the plug-in tries to modify the file it sets
-a file based lock. If it can't take the lock, it will wait and retry.
-After 3 attempts the upload process fails. To bypass this lock add <tt>-DignoreLock</tt> to the command-line (or add <tt>&lt;ignoreLock&gt;true&lt;ignoreLock&gt;</tt> to the configuration section of your Pom).</p>
-
-<h2><a name="MavenOBRPlugin-FTPprotocol"></a>FTP protocol</h2>
-
-<p>Not all protocols are supported by Maven out of the box. For example the ftp protocol requires the <b>wagon-ftp</b> component. To enable the ftp protocol add this to your Pom:</p>
-
-<div class="code"><div class="codeContent">
-<pre class="code-xml"><span class="code-tag">&lt;build&gt;</span>
-  <span class="code-tag">&lt;extensions&gt;</span>
-    <span class="code-tag">&lt;extension&gt;</span>
-      <span class="code-tag">&lt;groupId&gt;</span>org.apache.maven.wagon<span class="code-tag">&lt;/groupId&gt;</span>
-      <span class="code-tag">&lt;artifactId&gt;</span>wagon-ftp<span class="code-tag">&lt;/artifactId&gt;</span>
-      <span class="code-tag">&lt;version&gt;</span>1.0-alpha-6<span class="code-tag">&lt;/version&gt;</span>
-    <span class="code-tag">&lt;/extension&gt;</span>
-  <span class="code-tag">&lt;/extensions&gt;</span>
-<span class="code-tag">&lt;/build&gt;</span></pre>
-</div></div>
-
-<h2><a name="MavenOBRPlugin-Howtheplugincomputesthedescriptionofthebundle"></a>How the plug-in computes the description of the bundle</h2>
-
-<p>The description of the bundle comes from three different sources:</p>
-
-<ul>
-	<li>Bindex : Bindex is a tool that analyzes a bundle manifest to generate OBR description</li>
-	<li>pom.xml : by analyzing the pom file, various information is collected (symbolic name ...)</li>
-	<li>obr.xml : this file contains customized description and capabilities for the bundle</li>
-</ul>
-
-
-<p>These sources are merged together using the following precedence:</p>
-
-<div class="preformatted"><div class="preformattedContent">
-<pre>Bindex
-| (overrides)
-pom.xml
-| (overrides)
-obr.xml
-</pre>
-</div></div>
-
-<p>A warning message is displayed when existing information is overridden.</p>
-
-<h2><a name="MavenOBRPlugin-Knownissues&amp;limitations"></a>Known issues &amp; limitations</h2>
-
-<ol>
-	<li>obr.xml (file given by the user to add properties not found
-by Bindex) must be correct, because the plug-in does not check its
-syntax.</li>
-</ol>
-
-    </div>
-  
-</body></html>
diff --git a/maven-obr-plugin/doc/maven-obr-plugin_files/apache.png b/maven-obr-plugin/doc/maven-obr-plugin_files/apache.png
deleted file mode 100644
index 5132f65..0000000
--- a/maven-obr-plugin/doc/maven-obr-plugin_files/apache.png
+++ /dev/null
Binary files differ
diff --git a/maven-obr-plugin/doc/maven-obr-plugin_files/linkext7.gif b/maven-obr-plugin/doc/maven-obr-plugin_files/linkext7.gif
deleted file mode 100644
index f2dd2dc..0000000
--- a/maven-obr-plugin/doc/maven-obr-plugin_files/linkext7.gif
+++ /dev/null
Binary files differ
diff --git a/maven-obr-plugin/doc/maven-obr-plugin_files/logo.png b/maven-obr-plugin/doc/maven-obr-plugin_files/logo.png
deleted file mode 100644
index dccbddc..0000000
--- a/maven-obr-plugin/doc/maven-obr-plugin_files/logo.png
+++ /dev/null
Binary files differ
diff --git a/maven-obr-plugin/doc/maven-obr-plugin_files/site.css b/maven-obr-plugin/doc/maven-obr-plugin_files/site.css
deleted file mode 100644
index 959ab0a..0000000
--- a/maven-obr-plugin/doc/maven-obr-plugin_files/site.css
+++ /dev/null
@@ -1,25 +0,0 @@
-/* @override http://felix.apache.org/site/media.data/site.css */
-
-body { background-color: #ffffff; color: #3b3b3b; font-family: Tahoma, Arial, sans-serif; font-size: 10pt; line-height: 140% }
-h1, h2, h3, h4, h5, h6 { font-weight: normal; color: #000000; line-height: 100%; margin-top: 0px}
-h1 { font-size: 200% }
-h2 { font-size: 175% }
-h3 { font-size: 150% }
-h4 { font-size: 140% }
-h5 { font-size: 130% }
-h6 { font-size: 120% }
-a { color: #1980af }
-a:visited { color: #1980af }
-a:hover { color: #1faae9 }
-.title { position: absolute; left: 1px; right: 1px; top:25px; height: 81px; background: url(http://felix.apache.org/site/media.data/gradient.png) repeat-x; background-position: bottom; }
-.logo { position: absolute; width: 15em; height: 81px; text-align: center; }
-.header { text-align: right; margin-right: 20pt; margin-top: 30pt;}
-.menu { border-top: 10px solid #f9bb00; position: absolute; top: 107px; left: 1px; width: 15em; bottom: 0px; padding: 0px; background-color: #fcfcfc }
-.menu ul { background-color: #fdf5d9; list-style: none; padding-left: 4em; margin-top: 0px; padding-top: 2em; padding-bottom: 2em; margin-left: 0px; color: #4a4a43}
-.menu a { text-decoration: none; color: #4a4a43 }
-.main { position: absolute; border-top: 10px solid #cde0ea; top: 107px; left: 15em; right: 1px; margin-left: 2px; padding-right: 4em; padding-left: 1em; padding-top: 1em;}
-.code { background-color: #eeeeee; border: solid 1px black; padding: 0.5em }
-.code-keyword { color: #880000 }
-.code-quote { color: #008800 }
-.code-object { color: #0000dd }
-.code-java { margin: 0em }
\ No newline at end of file
diff --git a/maven-obr-plugin/pom.xml b/maven-obr-plugin/pom.xml
deleted file mode 100644
index f29ab50..0000000
--- a/maven-obr-plugin/pom.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.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">
-
-  <parent>
-    <artifactId>felix</artifactId>
-    <groupId>org.apache.felix</groupId>
-    <version>1.0.4</version>
-    <relativePath>../pom/pom.xml</relativePath>
- </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>maven-obr-plugin</artifactId>
-  <version>1.2.1-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
-  
-  <name>OBR Maven Plugin</name>
-  <description>
-    Provides a maven plugin that supports the automatic creation and
-    update of an OSGi Bundle Repository compliant with OSGi RFC 0112.
-  </description>
-
-  <dependencies>
-    <dependency>
-      <groupId>net.sf.kxml</groupId>
-      <artifactId>kxml2</artifactId>
-      <version>2.2.2</version>
-    </dependency>
-    <dependency>
-      <groupId>xmlpull</groupId>
-      <artifactId>xmlpull</artifactId>
-      <version>1.1.3.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.osgi.core</artifactId>
-      <version>1.0.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.osgi.service.obr</artifactId>
-      <version>1.0.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-model</artifactId>
-      <version>2.0.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-artifact</artifactId>
-      <version>2.0.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-artifact-manager</artifactId>
-      <version>2.0.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-settings</artifactId>
-      <version>2.0.7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.wagon</groupId>
-      <artifactId>wagon-provider-api</artifactId>
-      <version>1.0-beta-2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-utils</artifactId>
-      <version>1.4.7</version>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/AbstractFileMojo.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/AbstractFileMojo.java
deleted file mode 100644
index ddd6c1d..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/AbstractFileMojo.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.obr.plugin;
-
-
-import java.io.File;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-
-
-/**
- * Base class for the command-line install-file and deploy-file goals.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public abstract class AbstractFileMojo extends AbstractMojo
-{
-    /**
-     * GroupId of the bundle. Retrieved from POM file if specified.
-     *
-     * @parameter expression="${groupId}"
-     */
-    private String groupId;
-
-    /**
-     * ArtifactId of the bundle. Retrieved from POM file if specified.
-     *
-     * @parameter expression="${artifactId}"
-     */
-    private String artifactId;
-
-    /**
-     * Version of the bundle. Retrieved from POM file if specified.
-     *
-     * @parameter expression="${version}"
-     */
-    private String version;
-
-    /**
-     * Packaging type of the bundle. Retrieved from POM file if specified.
-     *
-     * @parameter expression="${packaging}"
-     */
-    private String packaging;
-
-    /**
-     * Classifier type of the bundle. Defaults to none.
-     *
-     * @parameter expression="${classifier}"
-     */
-    private String classifier;
-
-    /**
-     * Location of an existing POM file.
-     *
-     * @parameter expression="${pomFile}"
-     */
-    private File pomFile;
-
-    /**
-     * Bundle file, defaults to the artifact in the local Maven repository.
-     *
-     * @parameter expression="${file}"
-     */
-    protected File file;
-
-    /**
-     * Optional XML file describing additional requirements and capabilities.
-     * 
-     * @parameter expression="${obrXml}"
-     */
-    protected String obrXml;
-
-    /**
-     * Component factory for Maven artifacts
-     * 
-     * @component
-     */
-    private ArtifactFactory m_factory;
-
-
-    /**
-     * @return project based on command-line settings, with bundle attached
-     * @throws MojoExecutionException
-     */
-    public MavenProject getProject() throws MojoExecutionException
-    {
-        final MavenProject project;
-        if ( pomFile != null && pomFile.exists() )
-        {
-            project = PomHelper.readPom( pomFile );
-
-            groupId = project.getGroupId();
-            artifactId = project.getArtifactId();
-            version = project.getVersion();
-            packaging = project.getPackaging();
-        }
-        else
-        {
-            project = PomHelper.buildPom( groupId, artifactId, version, packaging );
-        }
-
-        if ( groupId == null || artifactId == null || version == null || packaging == null )
-        {
-            throw new MojoExecutionException( "Missing group, artifact, version, or packaging information" );
-        }
-
-        Artifact bundle = m_factory.createArtifactWithClassifier( groupId, artifactId, version, packaging, classifier );
-        project.setArtifact( bundle );
-
-        return project;
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Capability.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Capability.java
deleted file mode 100644
index 4bf0f76..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Capability.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.obr.plugin;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * This class describe and store capability node.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class Capability
-{
-
-    /**
-     * m_name: name of the capability.
-     */
-    private String m_name;
-
-    /**
-     * m_p: List of PElement.
-     */
-    private List m_p = new ArrayList();
-
-
-    /**
-     * get the name attribute.
-     * 
-     * @return name attribute
-     */
-    public String getName()
-    {
-        return m_name;
-    }
-
-
-    /**
-     * set the name attribute.
-     * 
-     * @param name new name value
-     *            
-     */
-    public void setName( String name )
-    {
-        m_name = name;
-    }
-
-
-    /**
-     * return the capabilities.
-     * 
-     * @return List of PElement
-     */
-    public List getP()
-    {
-        return m_p;
-    }
-
-
-    /**
-     * set the capabilities.
-     * 
-     * @param mp List of PElement
-     *            
-     */
-    public void setP( List mp )
-    {
-        m_p = mp;
-    }
-
-
-    /**
-     * add one element in List.
-     * 
-     * @param pelement PElement
-     *            
-     */
-    public void addP( PElement pelement )
-    {
-        m_p.add( pelement );
-    }
-
-
-    /**
-     * transform this object to Node.
-     * 
-     * @param father father document for create Node
-     * @return node
-     */
-    public Node getNode( Document father )
-    {
-        Element capability = father.createElement( "capability" );
-        capability.setAttribute( "name", getName() );
-        for ( int i = 0; i < getP().size(); i++ )
-        {
-            capability.appendChild( ( ( PElement ) ( getP().get( i ) ) ).getNode( father ) );
-        }
-        return capability;
-    }
-
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Category.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Category.java
deleted file mode 100644
index 75086da..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Category.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.obr.plugin;
-
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * describe and store category node.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-
-public class Category
-{
-    /**
-     * id of the category.
-     */
-    private String m_id;
-
-
-    /**
-     * get the id attribute.
-     * 
-     * @return id
-     */
-    public String getId()
-    {
-        return m_id;
-    }
-
-
-    /**
-     * set the id attribute.
-     * @param id new id value
-     */
-    public void setId( String id )
-    {
-        m_id = id;
-    }
-
-
-    /**
-     * transform this object to node.
-     * @param father father document for create Node
-     * @return node
-     */
-    public Node getNode( Document father )
-    {
-        Element category = father.createElement( "category" );
-        category.setAttribute( "id", getId() );
-        return category;
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Config.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Config.java
deleted file mode 100644
index c2d12c7..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Config.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.obr.plugin;
-
-
-import java.net.URI;
-
-
-/**
- * this class is used to store some user information about configuration of the plugin.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- *
- */
-public class Config
-{
-    private boolean m_pathRelative; // use relative or absolute path in repository.xml
-    private boolean m_remoteFile; // deploy file on remote server
-    private URI m_remoteBundle; // public address of deployed bundle
-
-
-    /**
-     * constructor: set default configuration: use relative path and don't upload file.
-     */
-    public Config()
-    {
-        // default configuration
-        m_pathRelative = true;
-        m_remoteFile = false;
-        m_remoteBundle = null;
-    }
-
-
-    /**
-     * @param value enable to use relative path
-     */
-    public void setPathRelative( boolean value )
-    {
-        m_pathRelative = value;
-    }
-
-
-    /**
-     * @param value enable when uploading
-     */
-    public void setRemoteFile( boolean value )
-    {
-        m_remoteFile = value;
-    }
-
-
-    /**
-     * @param value public address of deployed bundle
-     */
-    public void setRemoteBundle( URI value )
-    {
-        m_remoteBundle = value;
-    }
-
-
-    /**
-     * @return true if plugin uses relative path, else false
-     */
-    public boolean isPathRelative()
-    {
-        return m_pathRelative;
-    }
-
-
-    /**
-     * @return true if the file will be uploaded, else false
-     */
-    public boolean isRemoteFile()
-    {
-        return m_remoteFile;
-    }
-
-
-    /**
-     * @return public address of deployed bundle
-     */
-    public URI getRemoteBundle()
-    {
-        return m_remoteBundle;
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ExtractBindexInfo.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ExtractBindexInfo.java
deleted file mode 100644
index 86aee85..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ExtractBindexInfo.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.obr.plugin;
-
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.osgi.impl.bundle.obr.resource.BundleInfo;
-import org.osgi.impl.bundle.obr.resource.CapabilityImpl;
-import org.osgi.impl.bundle.obr.resource.RepositoryImpl;
-import org.osgi.impl.bundle.obr.resource.RequirementImpl;
-import org.osgi.impl.bundle.obr.resource.ResourceImpl;
-import org.osgi.impl.bundle.obr.resource.VersionRange;
-
-
-/**
- * this class is used to configure bindex and get information built by bindex about targeted bundle.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ExtractBindexInfo
-{
-
-    /**
-     * attribute get from bindex which describe targeted resource.
-     */
-    private ResourceImpl m_resource;
-
-
-    /**
-     * configure bindex and build information.
-     * @param repoFilename URI on OBR descriptor file
-     * @param outFile path on targeted jar-file
-     * @throws MojoExecutionException occurs if bindex configuration failed
-     */
-    public ExtractBindexInfo( URI repoFilename, String outFile ) throws MojoExecutionException
-    {
-
-        m_resource = null;
-        RepositoryImpl repository = null;
-        try
-        {
-            repository = new RepositoryImpl( new File( repoFilename ).getAbsoluteFile().toURL() );
-        }
-        catch ( MalformedURLException e )
-        {
-            e.printStackTrace();
-            throw new MojoExecutionException( "MalformedURLException" );
-        }
-        BundleInfo info = null;
-        try
-        {
-            info = new BundleInfo( repository, new File( outFile ) );
-        }
-        catch ( Exception e )
-        {
-            e.printStackTrace();
-            throw new MojoExecutionException( "Exception" );
-        }
-
-        try
-        {
-            m_resource = info.build();
-        }
-        catch ( Exception e )
-        {
-            e.printStackTrace();
-            throw new MojoExecutionException( "Exception" );
-        }
-    }
-
-
-    /**
-     * extract capabilities from bindex information.
-     * @return bundle capabilities List
-     */
-    public List getCapabilities()
-    {
-        List list = new ArrayList();
-        Collection res = m_resource.getCapabilityList();
-        Iterator it = res.iterator();
-        while ( it.hasNext() )
-        {
-            Capability capability = new Capability();
-            CapabilityImpl ci = ( CapabilityImpl ) it.next();
-            capability.setName( ci.getName() );
-            // System.out.println(ci.getName()) ;
-            if ( !( ci.getName().compareTo( "bundle" ) == 0 ) )
-            {
-                Map properties = ci.getProperties();
-                for ( Iterator e = properties.entrySet().iterator(); e.hasNext(); )
-                {
-                    PElement p = new PElement();
-                    Map.Entry entry = ( Map.Entry ) e.next();
-                    String key = ( String ) entry.getKey();
-                    List values = ( List ) entry.getValue();
-                    for ( Iterator v = values.iterator(); v.hasNext(); )
-                    {
-                        Object value = v.next();
-                        p.setN( key );
-                        if ( value != null )
-                        {
-                            p.setV( value.toString() );
-                        }
-                        else
-                        {
-                            System.out.println( "Missing value " + key );
-                        }
-                        String type = null;
-                        if ( value instanceof Number )
-                        {
-                            type = "number";
-                        }
-                        else
-                        {
-                            if ( value instanceof VersionRange )
-                            {
-                                type = "version";
-                            }
-                        }
-                        if ( type != null )
-                        {
-                            p.setT( type );
-                        }
-                    }
-                    capability.addP( p );
-                }
-
-                list.add( capability );
-            }
-        }
-        return list;
-    }
-
-
-    /**
-     * extract requirement from bindex information.
-     * @return bundle requirement List
-     */
-    public List getRequirement()
-    {
-        List list = new ArrayList();
-        Collection res = m_resource.getRequirementList();
-        Iterator it = res.iterator();
-        while ( it.hasNext() )
-        {
-            RequirementImpl ci = ( RequirementImpl ) it.next();
-            Require require = new Require();
-
-            require.setExtend( String.valueOf( ci.isExtend() ) );
-            require.setMultiple( String.valueOf( ci.isMultiple() ) );
-            require.setOptional( String.valueOf( ci.isOptional() ) );
-            require.setName( ci.getName() );
-            require.setFilter( ci.getFilter() );
-            require.setValue( ci.getComment() );
-            list.add( require );
-        }
-        return list;
-    }
-
-
-    /**
-     * extract symbolic name from bindex information.
-     * @return bundle symbolic name
-     */
-    public String getSymbolicName()
-    {
-        return m_resource.getSymbolicName();
-    }
-
-
-    /**
-     * extract version from bindex information.
-     * @return bundle version
-     */
-    public String getVersion()
-    {
-        if ( m_resource.getVersion() != null )
-        {
-            return m_resource.getVersion().toString();
-        }
-
-        return null;
-    }
-
-
-    /**
-     * extract presentation name from bindex information.
-     * @return bundle presentation name
-     */
-    public String getPresentationName()
-    {
-        return m_resource.getPresentationName();
-    }
-
-
-    /**
-     * extract copyright from bindex information.
-     * @return bundle copyright
-     */
-    public String getCopyright()
-    {
-        return m_resource.getCopyright();
-    }
-
-
-    /**
-     * extract description from bindex information.
-     * @return bundle description
-     */
-    public String getDescription()
-    {
-        return m_resource.getDescription();
-    }
-
-
-    /**
-     * extract documentation from bindex information.
-     * @return bundle documentation
-     */
-    public String getDocumentation()
-    {
-        if ( m_resource.getDocumentation() != null )
-        {
-            return m_resource.getDocumentation().toString();
-        }
-
-        return null;
-    }
-
-
-    /**
-     * extract license from bindex information.
-     * @return bundle license
-     */
-    public String getLicense()
-    {
-        if ( m_resource.getLicense() != null )
-        {
-            return m_resource.getLicense().toString();
-        }
-
-        return null;
-    }
-
-
-    /**
-     * extract source from bindex information.
-     * @return bundle source
-     */
-    public String getSource()
-    {
-        if ( m_resource.getSource() != null )
-        {
-            return m_resource.getSource().toString();
-        }
-
-        return null;
-    }
-
-
-    /**
-     * extract source from bindex information.
-     * @return bundle source
-     */
-    public String getId()
-    {
-        if ( m_resource.getId() != null )
-        {
-            return m_resource.getId();
-        }
-
-        return null;
-    }
-
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrCleanRepo.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrCleanRepo.java
deleted file mode 100644
index f89d08d..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrCleanRepo.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.obr.plugin;
-
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.URI;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Properties;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Result;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-
-/**
- * Clean an OBR repository by finding and removing missing resources.
- * 
- * @requiresProject false
- * @goal clean
- * @phase clean
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ObrCleanRepo extends AbstractMojo
-{
-    /**
-     * OBR Repository.
-     * 
-     * @parameter expression="${obrRepository}"
-     */
-    private String obrRepository;
-
-    /**
-     * Local Repository.
-     * 
-     * @parameter expression="${localRepository}"
-     * @required
-     * @readonly
-     */
-    private ArtifactRepository localRepository;
-
-
-    public void execute()
-    {
-        if ( "NONE".equalsIgnoreCase( obrRepository ) )
-        {
-            getLog().info( "OBR clean disabled (enable with -DobrRepository)" );
-            return;
-        }
-
-        try
-        {
-            // Compute local repository location
-            URI repositoryXml = ObrUtils.findRepositoryXml( localRepository.getBasedir(), obrRepository );
-            if ( !"file".equals( repositoryXml.getScheme() ) )
-            {
-                getLog().error( "The repository URI " + repositoryXml + " is not a local file" );
-                return;
-            }
-
-            File repositoryFile = new File( repositoryXml );
-
-            // Check if the file exist
-            if ( !repositoryFile.exists() )
-            {
-                getLog().error( "The repository file " + repositoryFile + " does not exist" );
-                return;
-            }
-
-            getLog().info( "Cleaning..." );
-
-            Document doc = parseFile( repositoryFile, initConstructor() );
-            Node finalDocument = cleanDocument( doc.getDocumentElement() ); // Analyze existing repository.
-
-            if ( finalDocument == null )
-            {
-                getLog().info( "Nothing to clean in " + repositoryFile );
-            }
-            else
-            {
-                writeToFile( repositoryXml, finalDocument ); // Write the new file
-                getLog().info( "Repository " + repositoryFile + " cleaned" );
-            }
-        }
-        catch ( Exception e )
-        {
-            getLog().error( "Exception while cleaning local OBR: " + e.getLocalizedMessage(), e );
-        }
-    }
-
-
-    /**
-     * Analyze the given XML tree (DOM of the repository file) and remove missing resources.
-     * 
-     * @param elem : the input XML tree
-     * @return the cleaned XML tree
-     */
-    private Element cleanDocument( Element elem )
-    {
-        String localRepoPath = localRepository.getBasedir();
-        NodeList nodes = elem.getElementsByTagName( "resource" );
-        List toRemove = new ArrayList();
-
-        // First, look for missing resources
-        for ( int i = 0; i < nodes.getLength(); i++ )
-        {
-            Element n = ( Element ) nodes.item( i );
-            String value = n.getAttribute( "uri" );
-
-            File file = new File( localRepoPath, value );
-            if ( !file.exists() )
-            {
-                getLog().info(
-                    "The bundle " + n.getAttribute( "presentationname" ) + " - " + n.getAttribute( "version" )
-                        + " will be removed" );
-                toRemove.add( n );
-            }
-        }
-
-        Date d = new Date();
-        if ( toRemove.size() > 0 )
-        {
-            // Then remove missing resources.
-            for ( int i = 0; i < toRemove.size(); i++ )
-            {
-                elem.removeChild( ( Node ) toRemove.get( i ) );
-            }
-
-            // If we have to remove resources, we need to update 'lastmodified' attribute
-            SimpleDateFormat format = new SimpleDateFormat( "yyyyMMddHHmmss.SSS" );
-            d.setTime( System.currentTimeMillis() );
-            elem.setAttribute( "lastmodified", format.format( d ) );
-            return elem;
-        }
-
-        return null;
-    }
-
-
-    /**
-     * Initialize the document builder from Xerces.
-     * 
-     * @return DocumentBuilder ready to create new document
-     * @throws MojoExecutionException : occurs when the instantiation of the document builder fails
-     */
-    private DocumentBuilder initConstructor() throws MojoExecutionException
-    {
-        DocumentBuilder constructor = null;
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        try
-        {
-            constructor = factory.newDocumentBuilder();
-        }
-        catch ( ParserConfigurationException e )
-        {
-            getLog().error( "Unable to create a new xml document" );
-            throw new MojoExecutionException( "Cannot create the Document Builder : " + e.getMessage() );
-        }
-        return constructor;
-    }
-
-
-    /**
-     * Open an XML file.
-     * 
-     * @param filename : XML file path
-     * @param constructor DocumentBuilder get from xerces
-     * @return Document which describes this file
-     * @throws MojoExecutionException occurs when the given file cannot be opened or is a valid XML file.
-     */
-    private Document parseFile( File file, DocumentBuilder constructor ) throws MojoExecutionException
-    {
-        if ( constructor == null )
-        {
-            return null;
-        }
-        // The document is the root of the DOM tree.
-        File targetFile = file.getAbsoluteFile();
-        getLog().info( "Parsing " + targetFile );
-        Document doc = null;
-        try
-        {
-            doc = constructor.parse( targetFile );
-        }
-        catch ( SAXException e )
-        {
-            getLog().error( "Cannot parse " + targetFile + " : " + e.getMessage() );
-            throw new MojoExecutionException( "Cannot parse " + targetFile + " : " + e.getMessage() );
-        }
-        catch ( IOException e )
-        {
-            getLog().error( "Cannot open " + targetFile + " : " + e.getMessage() );
-            throw new MojoExecutionException( "Cannot open " + targetFile + " : " + e.getMessage() );
-        }
-        return doc;
-    }
-
-
-    /**
-     * write a Node in a xml file.
-     * 
-     * @param outputFilename URI to the output file
-     * @param treeToBeWrite Node root of the tree to be write in file
-     * @throws MojoExecutionException if the plugin failed
-     */
-    private void writeToFile( URI outputFilename, Node treeToBeWrite ) throws MojoExecutionException
-    {
-        // init the transformer
-        Transformer transformer = null;
-        TransformerFactory tfabrique = TransformerFactory.newInstance();
-        try
-        {
-            transformer = tfabrique.newTransformer();
-        }
-        catch ( TransformerConfigurationException e )
-        {
-            getLog().error( "Unable to write to file: " + outputFilename.toString() );
-            throw new MojoExecutionException( "Unable to write to file: " + outputFilename.toString() + " : "
-                + e.getMessage() );
-        }
-        Properties proprietes = new Properties();
-        proprietes.put( "method", "xml" );
-        proprietes.put( "version", "1.0" );
-        proprietes.put( "encoding", "ISO-8859-1" );
-        proprietes.put( "standalone", "yes" );
-        proprietes.put( "indent", "yes" );
-        proprietes.put( "omit-xml-declaration", "no" );
-        transformer.setOutputProperties( proprietes );
-
-        DOMSource input = new DOMSource( treeToBeWrite );
-
-        File fichier = new File( outputFilename );
-        FileOutputStream flux = null;
-        try
-        {
-            flux = new FileOutputStream( fichier );
-        }
-        catch ( FileNotFoundException e )
-        {
-            getLog().error( "Unable to write to file: " + fichier.getName() );
-            throw new MojoExecutionException( "Unable to write to file: " + fichier.getName() + " : " + e.getMessage() );
-        }
-        Result output = new StreamResult( flux );
-        try
-        {
-            transformer.transform( input, output );
-        }
-        catch ( TransformerException e )
-        {
-            throw new MojoExecutionException( "Unable to write to file: " + outputFilename.toString() + " : "
-                + e.getMessage() );
-        }
-
-        try
-        {
-            flux.flush();
-            flux.close();
-        }
-        catch ( IOException e )
-        {
-            throw new MojoExecutionException( "IOException when closing file : " + e.getMessage() );
-        }
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrDeploy.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrDeploy.java
deleted file mode 100644
index 7915082..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrDeploy.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.obr.plugin;
-
-
-import java.io.File;
-import java.net.URI;
-import java.util.Arrays;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.maven.artifact.manager.WagonManager;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.settings.Settings;
-
-
-/**
- * Deploys bundle details to a remote OBR repository (life-cycle goal)
- * 
- * @goal deploy
- * @phase deploy
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public final class ObrDeploy extends AbstractMojo
-{
-    /**
-     * When true, ignore remote locking.
-     * 
-     * @parameter expression="${ignoreLock}"
-     */
-    private boolean ignoreLock;
-
-    /**
-     * OBR Repository.
-     * 
-     * @parameter expression="${obrRepository}"
-     */
-    private String obrRepository;
-
-    /**
-     * Project types which this plugin supports.
-     *
-     * @parameter
-     */
-    private List supportedProjectTypes = Arrays.asList( new String[]
-        { "jar", "bundle" } );
-
-    /**
-     * @parameter expression="${project.distributionManagementArtifactRepository}"
-     * @readonly
-     */
-    private ArtifactRepository deploymentRepository;
-
-    /**
-     * Alternative deployment repository. Format: id::layout::url
-     * 
-     * @parameter expression="${altDeploymentRepository}"
-     */
-    private String altDeploymentRepository;
-
-    /**
-     * Local Repository.
-     * 
-     * @parameter expression="${localRepository}"
-     * @required
-     * @readonly
-     */
-    private ArtifactRepository localRepository;
-
-    /**
-     * The Maven project.
-     * 
-     * @parameter expression="${project}"
-     * @required
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * Local Maven settings.
-     * 
-     * @parameter expression="${settings}"
-     * @required
-     * @readonly
-     */
-    private Settings settings;
-
-    /**
-     * The Wagon manager.
-     * 
-     * @component
-     */
-    private WagonManager m_wagonManager;
-
-
-    public void execute() throws MojoExecutionException
-    {
-        if ( !supportedProjectTypes.contains( project.getPackaging() ) )
-        {
-            getLog().info( "Ignoring packaging type " + project.getPackaging() );
-            return;
-        }
-        else if ( "NONE".equalsIgnoreCase( obrRepository ) )
-        {
-            getLog().info( "OBR update disabled (enable with -DobrRepository)" );
-            return;
-        }
-
-        URI tempURI = ObrUtils.findRepositoryXml( "", obrRepository );
-        String repositoryName = new File( tempURI.getPath() ).getName();
-
-        Log log = getLog();
-        ObrUpdate update;
-
-        RemoteFileManager remoteFile = new RemoteFileManager( m_wagonManager, settings, log );
-        openRepositoryConnection( remoteFile );
-
-        // ======== LOCK REMOTE OBR ========
-        log.info( "LOCK " + remoteFile + '/' + repositoryName );
-        remoteFile.lockFile( repositoryName, ignoreLock );
-        File downloadedRepositoryXml = null;
-
-        try
-        {
-            // ======== DOWNLOAD REMOTE OBR ========
-            log.info( "Downloading " + repositoryName );
-            downloadedRepositoryXml = remoteFile.get( repositoryName, ".xml" );
-
-            String mavenRepository = localRepository.getBasedir();
-
-            URI repositoryXml = downloadedRepositoryXml.toURI();
-            URI obrXmlFile = ObrUtils.findObrXml( project.getResources() );
-            URI bundleJar = ObrUtils.findBundleJar( localRepository, project.getArtifact() );
-
-            Config userConfig = new Config();
-            userConfig.setPathRelative( true );
-            userConfig.setRemoteFile( true );
-
-            update = new ObrUpdate( repositoryXml, obrXmlFile, project, bundleJar, mavenRepository, userConfig, log );
-
-            update.updateRepository();
-
-            if ( downloadedRepositoryXml.exists() )
-            {
-                // ======== UPLOAD MODIFIED OBR ========
-                log.info( "Uploading " + repositoryName );
-                remoteFile.put( downloadedRepositoryXml, repositoryName );
-            }
-        }
-        catch ( Exception e )
-        {
-            log.warn( "Exception while updating remote OBR: " + e.getLocalizedMessage(), e );
-        }
-        finally
-        {
-            // ======== UNLOCK REMOTE OBR ========
-            log.info( "UNLOCK " + remoteFile + '/' + repositoryName );
-            remoteFile.unlockFile( repositoryName );
-            remoteFile.disconnect();
-
-            if ( null != downloadedRepositoryXml )
-            {
-                downloadedRepositoryXml.delete();
-            }
-        }
-    }
-
-    private static final Pattern ALT_REPO_SYNTAX_PATTERN = Pattern.compile( "(.+)::(.+)::(.+)" );
-
-
-    private void openRepositoryConnection( RemoteFileManager remoteFile ) throws MojoExecutionException
-    {
-        if ( deploymentRepository == null && altDeploymentRepository == null )
-        {
-            String msg = "Deployment failed: repository element was not specified in the pom inside"
-                + " distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter";
-
-            throw new MojoExecutionException( msg );
-        }
-
-        if ( altDeploymentRepository != null )
-        {
-            getLog().info( "Using alternate deployment repository " + altDeploymentRepository );
-
-            Matcher matcher = ALT_REPO_SYNTAX_PATTERN.matcher( altDeploymentRepository );
-            if ( !matcher.matches() )
-            {
-                throw new MojoExecutionException( "Invalid syntax for alternative repository \""
-                    + altDeploymentRepository + "\". Use \"id::layout::url\"." );
-            }
-
-            remoteFile.connect( matcher.group( 1 ).trim(), matcher.group( 3 ).trim() );
-        }
-        else
-        {
-            remoteFile.connect( deploymentRepository.getId(), deploymentRepository.getUrl() );
-        }
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrDeployFile.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrDeployFile.java
deleted file mode 100644
index ca673f0..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrDeployFile.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.obr.plugin;
-
-
-import java.io.File;
-import java.net.URI;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.maven.artifact.manager.WagonManager;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.settings.Settings;
-
-
-/**
- * Deploys bundle details to a remote OBR repository (command-line goal)
- * 
- * @requiresProject false
- * @goal deploy-file
- * @phase deploy
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public final class ObrDeployFile extends AbstractFileMojo
-{
-    /**
-     * When true, ignore remote locking.
-     * 
-     * @parameter expression="${ignoreLock}"
-     */
-    private boolean ignoreLock;
-
-    /**
-     * OBR Repository.
-     * 
-     * @parameter expression="${obrRepository}"
-     */
-    private String obrRepository;
-
-    /**
-     * Project types which this plugin supports.
-     *
-     * @parameter
-     */
-    private List supportedProjectTypes = Arrays.asList( new String[]
-        { "jar", "bundle" } );
-
-    /**
-     * Remote repository id, used to lookup authentication settings.
-     *
-     * @parameter expression="${repositoryId}" default-value="remote-repository"
-     * @required
-     */
-    private String repositoryId;
-
-    /**
-     * Remote OBR repository URL, where the bundle details are to be uploaded.
-     *
-     * @parameter expression="${url}"
-     * @required
-     */
-    private String url;
-
-    /**
-     * Optional public URL where the bundle has been deployed.
-     *
-     * @parameter expression="${bundleUrl}"
-     */
-    private String bundleUrl;
-
-    /**
-     * Local Repository.
-     * 
-     * @parameter expression="${localRepository}"
-     * @required
-     * @readonly
-     */
-    private ArtifactRepository localRepository;
-
-    /**
-     * Local Maven settings.
-     * 
-     * @parameter expression="${settings}"
-     * @required
-     * @readonly
-     */
-    private Settings settings;
-
-    /**
-     * The Wagon manager.
-     * 
-     * @component
-     */
-    private WagonManager m_wagonManager;
-
-
-    public void execute() throws MojoExecutionException
-    {
-        MavenProject project = getProject();
-
-        if ( !supportedProjectTypes.contains( project.getPackaging() ) )
-        {
-            getLog().info( "Ignoring packaging type " + project.getPackaging() );
-            return;
-        }
-        else if ( "NONE".equalsIgnoreCase( obrRepository ) )
-        {
-            getLog().info( "OBR update disabled (enable with -DobrRepository)" );
-            return;
-        }
-
-        URI tempURI = ObrUtils.findRepositoryXml( "", obrRepository );
-        String repositoryName = new File( tempURI.getPath() ).getName();
-
-        Log log = getLog();
-        ObrUpdate update;
-
-        RemoteFileManager remoteFile = new RemoteFileManager( m_wagonManager, settings, log );
-        remoteFile.connect( repositoryId, url );
-
-        // ======== LOCK REMOTE OBR ========
-        log.info( "LOCK " + remoteFile + '/' + repositoryName );
-        remoteFile.lockFile( repositoryName, ignoreLock );
-        File downloadedRepositoryXml = null;
-
-        try
-        {
-            // ======== DOWNLOAD REMOTE OBR ========
-            log.info( "Downloading " + repositoryName );
-            downloadedRepositoryXml = remoteFile.get( repositoryName, ".xml" );
-
-            String mavenRepository = localRepository.getBasedir();
-
-            URI repositoryXml = downloadedRepositoryXml.toURI();
-            URI obrXmlFile = ObrUtils.toFileURI( obrXml );
-            URI bundleJar;
-
-            if ( null == file )
-            {
-                bundleJar = ObrUtils.findBundleJar( localRepository, project.getArtifact() );
-            }
-            else
-            {
-                bundleJar = file.toURI();
-            }
-
-            URI remoteBundleURI = null;
-            if ( null != bundleUrl )
-            {
-                remoteBundleURI = URI.create( bundleUrl );
-            }
-            else if ( null != file )
-            {
-                remoteBundleURI = URI.create( localRepository.pathOf( project.getArtifact() ) );
-            }
-
-            Config userConfig = new Config();
-            userConfig.setRemoteBundle( remoteBundleURI );
-            userConfig.setPathRelative( true );
-            userConfig.setRemoteFile( true );
-
-            update = new ObrUpdate( repositoryXml, obrXmlFile, project, bundleJar, mavenRepository, userConfig, log );
-
-            update.updateRepository();
-
-            if ( downloadedRepositoryXml.exists() )
-            {
-                // ======== UPLOAD MODIFIED OBR ========
-                log.info( "Uploading " + repositoryName );
-                remoteFile.put( downloadedRepositoryXml, repositoryName );
-            }
-        }
-        catch ( Exception e )
-        {
-            log.warn( "Exception while updating remote OBR: " + e.getLocalizedMessage(), e );
-        }
-        finally
-        {
-            // ======== UNLOCK REMOTE OBR ========
-            log.info( "UNLOCK " + remoteFile + '/' + repositoryName );
-            remoteFile.unlockFile( repositoryName );
-            remoteFile.disconnect();
-
-            if ( null != downloadedRepositoryXml )
-            {
-                downloadedRepositoryXml.delete();
-            }
-        }
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrInstall.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrInstall.java
deleted file mode 100644
index 8d0207f..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrInstall.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.obr.plugin;
-
-
-import java.net.URI;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.felix.obr.plugin.Config;
-import org.apache.felix.obr.plugin.ObrUpdate;
-import org.apache.felix.obr.plugin.ObrUtils;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-
-
-/**
- * Installs bundle details in the local OBR repository (life-cycle goal)
- * 
- * @goal install
- * @phase install
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public final class ObrInstall extends AbstractMojo
-{
-    /**
-     * OBR Repository.
-     * 
-     * @parameter expression="${obrRepository}"
-     */
-    private String obrRepository;
-
-    /**
-     * Project types which this plugin supports.
-     *
-     * @parameter
-     */
-    private List supportedProjectTypes = Arrays.asList( new String[]
-        { "jar", "bundle" } );
-
-    /**
-     * Local Repository.
-     * 
-     * @parameter expression="${localRepository}"
-     * @required
-     * @readonly
-     */
-    private ArtifactRepository localRepository;
-
-    /**
-     * The Maven project.
-     * 
-     * @parameter expression="${project}"
-     * @required
-     * @readonly
-     */
-    private MavenProject project;
-
-
-    public void execute()
-    {
-        if ( !supportedProjectTypes.contains( project.getPackaging() ) )
-        {
-            getLog().info( "Ignoring packaging type " + project.getPackaging() );
-            return;
-        }
-        else if ( "NONE".equalsIgnoreCase( obrRepository ) )
-        {
-            getLog().info( "OBR update disabled (enable with -DobrRepository)" );
-            return;
-        }
-
-        Log log = getLog();
-        ObrUpdate update;
-
-        try
-        {
-            String mavenRepository = localRepository.getBasedir();
-
-            URI repositoryXml = ObrUtils.findRepositoryXml( mavenRepository, obrRepository );
-            URI obrXmlFile = ObrUtils.findObrXml( project.getResources() );
-            URI bundleJar = ObrUtils.findBundleJar( localRepository, project.getArtifact() );
-
-            Config userConfig = new Config();
-
-            update = new ObrUpdate( repositoryXml, obrXmlFile, project, bundleJar, mavenRepository, userConfig, log );
-
-            update.updateRepository();
-        }
-        catch ( Exception e )
-        {
-            log.warn( "Exception while updating local OBR: " + e.getLocalizedMessage(), e );
-        }
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrInstallFile.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrInstallFile.java
deleted file mode 100644
index 2b22d57..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrInstallFile.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.obr.plugin;
-
-
-import java.net.URI;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-
-
-/**
- * Installs bundle details in the local OBR repository (command-line goal)
- * 
- * @requiresProject false
- * @goal install-file
- * @phase install
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public final class ObrInstallFile extends AbstractFileMojo
-{
-    /**
-     * OBR Repository.
-     * 
-     * @parameter expression="${obrRepository}"
-     */
-    private String obrRepository;
-
-    /**
-     * Project types which this plugin supports.
-     *
-     * @parameter
-     */
-    private List supportedProjectTypes = Arrays.asList( new String[]
-        { "jar", "bundle" } );
-
-    /**
-     * Local Repository.
-     * 
-     * @parameter expression="${localRepository}"
-     * @required
-     * @readonly
-     */
-    private ArtifactRepository localRepository;
-
-
-    public void execute() throws MojoExecutionException
-    {
-        MavenProject project = getProject();
-
-        if ( !supportedProjectTypes.contains( project.getPackaging() ) )
-        {
-            getLog().info( "Ignoring packaging type " + project.getPackaging() );
-            return;
-        }
-        else if ( "NONE".equalsIgnoreCase( obrRepository ) )
-        {
-            getLog().info( "OBR update disabled (enable with -DobrRepository)" );
-            return;
-        }
-
-        Log log = getLog();
-        ObrUpdate update;
-
-        String mavenRepository = localRepository.getBasedir();
-
-        URI repositoryXml = ObrUtils.findRepositoryXml( mavenRepository, obrRepository );
-        URI obrXmlFile = ObrUtils.toFileURI( obrXml );
-        URI bundleJar;
-
-        if ( null == file )
-        {
-            bundleJar = ObrUtils.findBundleJar( localRepository, project.getArtifact() );
-        }
-        else
-        {
-            bundleJar = file.toURI();
-        }
-
-        Config userConfig = new Config();
-
-        update = new ObrUpdate( repositoryXml, obrXmlFile, project, bundleJar, mavenRepository, userConfig, log );
-
-        update.updateRepository();
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrUpdate.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrUpdate.java
deleted file mode 100644
index 27dfd7e..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrUpdate.java
+++ /dev/null
@@ -1,582 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.obr.plugin;
-
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.URI;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Properties;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Result;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-
-/**
- * this class parse the old repository.xml file build the bundle resource description and update the repository.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ObrUpdate
-{
-    /**
-     * generate the date format to insert it in repository descriptor file.
-     */
-    static SimpleDateFormat m_format = new SimpleDateFormat( "yyyyMMddHHmmss.SSS" );
-
-    /**
-     * logger for this plugin.
-     */
-    private Log m_logger;
-
-    /**
-     * name and path to the repository descriptor file.
-     */
-    private URI m_repositoryXml;
-
-    /**
-     * name and path to the obr.xml file.
-     */
-    private URI m_obrXml;
-
-    /**
-     * name and path to the bundle jar file.
-     */
-    private URI m_bundleJar;
-
-    /**
-     * maven project description.
-     */
-    private MavenProject m_project;
-
-    /**
-     * user configuration information.
-     */
-    private Config m_userConfig;
-
-    /**
-     * used to build another xml document.
-     */
-    private DocumentBuilder m_documentBuilder;
-
-    /**
-     * root on parent document.
-     */
-    private Document m_repositoryDoc;
-
-    /**
-     * used to store bundle information.
-     */
-    private ResourcesBundle m_resourceBundle;
-
-    /**
-     * base URI used to relativize bundle URIs.
-     */
-    private URI m_baseURI;
-
-
-    /**
-     * initialize information.
-     * @param repositoryXml path to the repository descriptor file
-     * @param obrXml path and filename to the obr.xml file
-     * @param project maven project description
-     * @param bundleJar path to the bundle jar file
-     * @param mavenRepositoryPath path to the local maven repository
-     * @param userConfig user information
-     * @param logger plugin logger
-     */
-    public ObrUpdate( URI repositoryXml, URI obrXml, MavenProject project, URI bundleJar, String mavenRepositoryPath,
-        Config userConfig, Log logger )
-    {
-        m_bundleJar = bundleJar;
-        m_repositoryXml = repositoryXml;
-        m_obrXml = obrXml;
-        m_project = project;
-        m_logger = logger;
-
-        m_userConfig = userConfig;
-
-        m_resourceBundle = new ResourcesBundle( logger );
-
-        if ( userConfig.isRemoteFile() )
-        {
-            m_baseURI = ObrUtils.toFileURI( mavenRepositoryPath );
-        }
-        else
-        {
-            m_baseURI = m_repositoryXml;
-        }
-    }
-
-
-    /**
-     * update the repository descriptor file. parse the old repository descriptor file, get the old reference of the bundle or determine the id for a new bundle, extract information from bindex set the new information in descriptor file and save it.
-     * @throws MojoExecutionException if the plugin failed
-     */
-    public void updateRepository() throws MojoExecutionException
-    {
-        m_logger.debug( " (f) repositoryXml = " + m_repositoryXml );
-        m_logger.debug( " (f) bundleJar = " + m_bundleJar );
-        m_logger.debug( " (f) obrXml = " + m_obrXml );
-
-        m_documentBuilder = initDocumentBuilder();
-
-        if ( m_documentBuilder == null )
-        {
-            return;
-        }
-
-        // get the file size
-        File bundleFile = new File( m_bundleJar );
-        if ( bundleFile.exists() )
-        {
-            URI resourceURI = m_userConfig.getRemoteBundle();
-            if ( null == resourceURI )
-            {
-                resourceURI = m_bundleJar;
-                if ( m_userConfig.isPathRelative() )
-                {
-                    resourceURI = ObrUtils.getRelativeURI( m_baseURI, resourceURI );
-                }
-            }
-
-            m_resourceBundle.setSize( String.valueOf( bundleFile.length() ) );
-            m_resourceBundle.setUri( resourceURI.toASCIIString() );
-        }
-        else
-        {
-            m_logger.error( "file doesn't exist: " + m_bundleJar );
-            return;
-        }
-
-        // parse repository
-        if ( parseRepositoryXml() == -1 )
-        {
-            return;
-        }
-
-        // parse the obr.xml file
-        if ( m_obrXml != null )
-        {
-            m_logger.info( "Adding " + m_obrXml );
-
-            // URL url = getClass().getResource("/SchemaObr.xsd");
-            // TODO validate obr.xml file
-
-            Document obrXmlDoc = parseFile( m_obrXml, m_documentBuilder );
-            if ( obrXmlDoc == null )
-            {
-                return;
-            }
-
-            Node obrXmlRoot = obrXmlDoc.getDocumentElement();
-
-            // add contents to resource bundle
-            sortObrXml( obrXmlRoot );
-        }
-
-        ExtractBindexInfo bindexExtractor;
-        try
-        {
-            // use bindex to extract bundle information
-            bindexExtractor = new ExtractBindexInfo( m_repositoryXml, m_bundleJar.getPath() );
-        }
-        catch ( MojoExecutionException e )
-        {
-            m_logger.error( "unable to build Bindex informations" );
-            e.printStackTrace();
-
-            throw new MojoExecutionException( "BindexException" );
-        }
-
-        m_resourceBundle.construct( m_project, bindexExtractor );
-
-        Element rootElement = m_repositoryDoc.getDocumentElement();
-        if ( !walkOnTree( rootElement ) )
-        {
-            // the correct resource node was not found, we must create it
-            // we compute the new id
-            String id = m_resourceBundle.getId();
-            searchRepository( rootElement, id );
-        }
-
-        // the repository.xml file have been modified, so we save it
-        m_logger.info( "Writing OBR metadata" );
-        writeToFile( m_repositoryXml, rootElement );
-    }
-
-
-    /**
-     * init the document builder from xerces.
-     * @return DocumentBuilder ready to create new document
-     */
-    private DocumentBuilder initDocumentBuilder()
-    {
-        DocumentBuilder documentBuilder = null;
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        try
-        {
-            documentBuilder = factory.newDocumentBuilder();
-        }
-        catch ( ParserConfigurationException e )
-        {
-            m_logger.error( "unable to create a new xml document" );
-            e.printStackTrace();
-        }
-        return documentBuilder;
-
-    }
-
-
-    /**
-     * Parse the repository descriptor file.
-     * 
-     * @return 0 if the bundle is already in the descriptor, else -1
-     * @throws MojoExecutionException if the plugin failed
-     */
-    private int parseRepositoryXml() throws MojoExecutionException
-    {
-
-        File fout = new File( m_repositoryXml );
-        if ( !fout.exists() )
-        {
-            Document doc = m_documentBuilder.newDocument();
-
-            // create xml tree
-            Date d = new Date();
-            d.setTime( System.currentTimeMillis() );
-            Element root = doc.createElement( "repository" );
-            root.setAttribute( "lastmodified", m_format.format( d ) );
-            root.setAttribute( "name", "MyRepository" );
-            try
-            {
-                writeToFile( m_repositoryXml, root );
-            }
-            catch ( MojoExecutionException e )
-            {
-                e.printStackTrace();
-                throw new MojoExecutionException( "IOException" );
-            }
-        }
-
-        // now we parse the repository.xml file
-        m_repositoryDoc = parseFile( m_repositoryXml, m_documentBuilder );
-        if ( m_repositoryDoc == null )
-        {
-            return -1;
-        }
-
-        return 0;
-    }
-
-
-    /**
-     * transform a xml file to a xerces Document.
-     * @param filename path to the xml file
-     * @param documentBuilder DocumentBuilder get from xerces
-     * @return Document which describe this file
-     */
-    private Document parseFile( URI filename, DocumentBuilder documentBuilder )
-    {
-        if ( documentBuilder == null )
-        {
-            return null;
-        }
-        // The document is the root of the DOM tree.
-        m_logger.info( "Parsing " + filename );
-        Document doc = null;
-        try
-        {
-            doc = documentBuilder.parse( new File( filename ) );
-        }
-        catch ( SAXException e )
-        {
-            e.printStackTrace();
-            return null;
-        }
-        catch ( IOException e )
-        {
-            m_logger.error( "cannot open file: " + filename );
-            e.printStackTrace();
-            return null;
-        }
-        return doc;
-    }
-
-
-    /**
-     * put the information from obr.xml into ressourceBundle object.
-     * @param node Node to the OBR.xml file
-     */
-    private void sortObrXml( Node node )
-    {
-        if ( node.getNodeName().compareTo( "require" ) == 0 )
-        {
-            Require newRequireNode = new Require();
-            NamedNodeMap list = node.getAttributes();
-            try
-            {
-                newRequireNode.setExtend( list.getNamedItem( "extend" ).getNodeValue() );
-                newRequireNode.setMultiple( list.getNamedItem( "multiple" ).getNodeValue() );
-                newRequireNode.setOptional( list.getNamedItem( "optional" ).getNodeValue() );
-                newRequireNode.setFilter( list.getNamedItem( "filter" ).getNodeValue() );
-                newRequireNode.setName( list.getNamedItem( "name" ).getNodeValue() );
-            }
-            catch ( NullPointerException e )
-            {
-                m_logger
-                    .error( "the obr.xml file seems to be invalid in a \"require\" tag (one or more attributes are missing)" );
-                // e.printStackTrace();
-            }
-            newRequireNode.setValue( XmlHelper.getTextContent( node ) );
-            m_resourceBundle.addRequire( newRequireNode );
-        }
-        else if ( node.getNodeName().compareTo( "capability" ) == 0 )
-        {
-            Capability newCapability = new Capability();
-            try
-            {
-                newCapability.setName( node.getAttributes().getNamedItem( "name" ).getNodeValue() );
-            }
-            catch ( NullPointerException e )
-            {
-                m_logger.error( "attribute \"name\" is missing in obr.xml in a \"capability\" tag" );
-                e.printStackTrace();
-            }
-            NodeList list = node.getChildNodes();
-            for ( int i = 0; i < list.getLength(); i++ )
-            {
-                PElement p = new PElement();
-                Node n = list.item( i );
-                Node item = null;
-                // System.err.println(n.getNodeName());
-                if ( n.getNodeName().compareTo( "p" ) == 0 )
-                {
-
-                    p.setN( n.getAttributes().getNamedItem( "n" ).getNodeValue() );
-                    item = n.getAttributes().getNamedItem( "t" );
-                    if ( item != null )
-                    {
-                        p.setT( item.getNodeValue() );
-                    }
-                    item = n.getAttributes().getNamedItem( "v" );
-                    if ( item != null )
-                    {
-                        p.setV( item.getNodeValue() );
-                    }
-
-                    newCapability.addP( p );
-                }
-            }
-            m_resourceBundle.addCapability( newCapability );
-        }
-        else if ( node.getNodeName().compareTo( "category" ) == 0 )
-        {
-            Category newCategory = new Category();
-            newCategory.setId( node.getAttributes().getNamedItem( "id" ).getNodeValue() );
-            m_resourceBundle.addCategory( newCategory );
-        }
-        else
-        {
-            NodeList list = node.getChildNodes();
-            for ( int i = 0; i < list.getLength(); i++ )
-            {
-                sortObrXml( list.item( i ) );
-            }
-        }
-    }
-
-
-    /**
-     * write a Node in a xml file.
-     * @param outputFilename URI to the output file
-     * @param treeToBeWrite Node root of the tree to be write in file
-     * @throws MojoExecutionException if the plugin failed
-     */
-    private void writeToFile( URI outputFilename, Node treeToBeWrite ) throws MojoExecutionException
-    {
-        // init the transformer
-        Transformer transformer = null;
-        TransformerFactory tfabrique = TransformerFactory.newInstance();
-        try
-        {
-            transformer = tfabrique.newTransformer();
-        }
-        catch ( TransformerConfigurationException e )
-        {
-            m_logger.error( "Unable to write to file: " + outputFilename.toString() );
-            e.printStackTrace();
-            throw new MojoExecutionException( "TransformerConfigurationException" );
-        }
-        Properties proprietes = new Properties();
-        proprietes.put( "method", "xml" );
-        proprietes.put( "version", "1.0" );
-        proprietes.put( "encoding", "ISO-8859-1" );
-        proprietes.put( "standalone", "yes" );
-        proprietes.put( "indent", "yes" );
-        proprietes.put( "omit-xml-declaration", "no" );
-        transformer.setOutputProperties( proprietes );
-
-        DOMSource input = new DOMSource( treeToBeWrite );
-
-        File fichier = new File( outputFilename );
-        fichier.getParentFile().mkdirs();
-        FileOutputStream flux = null;
-        try
-        {
-            flux = new FileOutputStream( fichier );
-        }
-        catch ( FileNotFoundException e )
-        {
-            m_logger.error( "Unable to write to file: " + fichier.getName() );
-            e.printStackTrace();
-            throw new MojoExecutionException( "FileNotFoundException" );
-        }
-        Result output = new StreamResult( flux );
-        try
-        {
-            transformer.transform( input, output );
-        }
-        catch ( TransformerException e )
-        {
-            e.printStackTrace();
-            throw new MojoExecutionException( "TransformerException" );
-        }
-
-        try
-        {
-            flux.flush();
-            flux.close();
-        }
-        catch ( IOException e )
-        {
-            e.printStackTrace();
-            throw new MojoExecutionException( "IOException" );
-        }
-
-    }
-
-
-    /**
-     * walk on the tree until the targeted node was found.
-     * @param node targeted node
-     * @return true if the requiered node was found else false.
-     */
-    private boolean walkOnTree( Node node )
-    {
-
-        if ( node.getNodeName().compareTo( "resource" ) == 0 )
-        {
-            return resource( node );
-        }
-
-        // look at the repository node (first in the file)
-        if ( node.getNodeName().compareTo( "repository" ) == 0 )
-        {
-            Date d = new Date();
-            d.setTime( System.currentTimeMillis() );
-            NamedNodeMap nList = node.getAttributes();
-            Node n = nList.getNamedItem( "lastmodified" );
-            n.setNodeValue( m_format.format( d ) );
-        }
-
-        NodeList list = node.getChildNodes();
-        if ( list.getLength() > 0 )
-        {
-            for ( int i = 0; i < list.getLength(); i++ )
-            {
-                if ( walkOnTree( list.item( i ) ) )
-                {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-
-    /**
-     * put the resource bundle in the tree.
-     * @param node Node on the xml file
-     * @param id id of the bundle ressource
-     */
-    private void searchRepository( Node node, String id )
-    {
-        if ( node.getNodeName().compareTo( "repository" ) == 0 )
-        {
-            node.appendChild( m_resourceBundle.getNode( m_repositoryDoc ) );
-            return;
-        }
-
-        m_logger.info( "Second branch..." );
-        NodeList list = node.getChildNodes();
-        if ( list.getLength() > 0 )
-        {
-            for ( int i = 0; i < list.getLength(); i++ )
-            {
-                searchRepository( list.item( i ), id );
-            }
-        }
-    }
-
-
-    /**
-     * compare two node and update the array which compute the smallest free id.
-     * @param node : node
-     * @return true if the node is the same bundle than the ressourceBundle, else false.
-     */
-    private boolean resource( Node node )
-    {
-
-        // this part save all the id free if we need to add resource
-        String id = node.getAttributes().getNamedItem( "id" ).getNodeValue();
-        NamedNodeMap map = node.getAttributes();
-
-        if ( m_resourceBundle.isSameBundleResource( map.getNamedItem( "symbolicname" ).getNodeValue(), map
-            .getNamedItem( "version" ).getNodeValue() ) )
-        {
-            m_resourceBundle.setId( String.valueOf( id ) );
-            node.getParentNode().replaceChild( m_resourceBundle.getNode( m_repositoryDoc ), node );
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrUtils.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrUtils.java
deleted file mode 100644
index 94728a0..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ObrUtils.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.obr.plugin;
-
-
-import java.io.File;
-import java.net.URI;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.model.Resource;
-
-
-/**
- * Various OBR utility methods
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ObrUtils
-{
-    private static final String DOT_XML = ".xml";
-    private static final String REPO_XML = "repository.xml";
-    private static final String OBR_XML = "obr.xml";
-
-
-    /**
-     * @param mavenRepository path to local maven repository
-     * @param obrRepository path to specific repository.xml
-     * @return URI pointing to correct repository.xml
-     */
-    public static URI findRepositoryXml( String mavenRepository, String obrRepository )
-    {
-        String targetPath = obrRepository;
-
-        // Combine location settings into a single repository location
-        if ( null == targetPath || targetPath.trim().length() == 0 || "true".equalsIgnoreCase( targetPath ) )
-        {
-            targetPath = mavenRepository + '/' + REPO_XML;
-        }
-        else if ( !targetPath.toLowerCase().endsWith( DOT_XML ) )
-        {
-            targetPath = targetPath + '/' + REPO_XML;
-        }
-
-        URI uri;
-        try
-        {
-            uri = new URI( targetPath );
-            uri.toURL(); // check protocol
-        }
-        catch ( Exception e )
-        {
-            uri = null;
-        }
-
-        // fall-back to file-system approach
-        if ( null == uri || !uri.isAbsolute() )
-        {
-            uri = new File( targetPath ).toURI();
-        }
-
-        return uri;
-    }
-
-
-    /**
-     * @param resources collection of resource locations
-     * @return URI pointing to correct obr.xml, null if not found
-     */
-    public static URI findObrXml( Collection resources )
-    {
-        for ( Iterator i = resources.iterator(); i.hasNext(); )
-        {
-            Resource resource = ( Resource ) i.next();
-            File obrFile = new File( resource.getDirectory(), OBR_XML );
-            if ( obrFile.exists() )
-            {
-                return obrFile.toURI();
-            }
-        }
-        return null;
-    }
-
-
-    /**
-     * @param repository maven repository
-     * @param artifact maven artifact
-     * @return file URI pointing to artifact in repository
-     */
-    public static URI findBundleJar( ArtifactRepository repository, Artifact artifact )
-    {
-        String baseDir = repository.getBasedir();
-        String artifactPath = repository.pathOf( artifact );
-
-        return toFileURI( baseDir + '/' + artifactPath );
-    }
-
-
-    /**
-     * @param path filesystem path
-     * @return file URI for the path
-     */
-    public static URI toFileURI( String path )
-    {
-        if ( null == path )
-        {
-            return null;
-        }
-        else if ( path.startsWith( "file:" ) )
-        {
-            return URI.create( path );
-        }
-        else
-        {
-            return new File( path ).toURI();
-        }
-    }
-
-
-    /**
-     * @param repositoryXml URI pointing to repository.xml, or directory containing it
-     * @param bundleJar URI pointing to bundle jarfile
-     * @return relative URI to bundle jarfile
-     */
-    public static URI getRelativeURI( URI repositoryXml, URI bundleJar )
-    {
-        try
-        {
-            String repositoryPath = repositoryXml.getPath();
-            if ( repositoryPath.toLowerCase().endsWith( DOT_XML ) )
-            {
-                // remove filename to get containing directory
-                int dirnameIndex = repositoryPath.lastIndexOf( '/' );
-                repositoryPath = repositoryPath.substring( 0, dirnameIndex );
-            }
-
-            URI rootURI = new URI( null, repositoryPath, null );
-            URI localURI = new URI( null, bundleJar.getPath(), null );
-
-            return rootURI.relativize( localURI );
-        }
-        catch ( Exception e )
-        {
-            return bundleJar;
-        }
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/PElement.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/PElement.java
deleted file mode 100644
index 63ae409..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/PElement.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.obr.plugin;
-
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * this class describe the p element in a capability tag.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- * 
- */
-public class PElement
-{
-    /**
-     * store the v tag (value).
-     */
-    private String m_v;
-
-    /**
-     * store the t tag (type).
-     */
-    private String m_t;
-
-    /**
-     * store the n tag (name).
-     */
-    private String m_n;
-
-
-    /**
-     * get the n tag.
-     * @return attribute n
-     */
-    public String getN()
-    {
-        return m_n;
-    }
-
-
-    /**
-     * set the n tage.
-     * @param n new value
-     */
-    public void setN( String n )
-    {
-        m_n = n;
-    }
-
-
-    /**
-     * get the t tag.
-     * @return attribute t
-     */
-    public String getT()
-    {
-        return m_t;
-    }
-
-
-    /**
-     * set the t tag.
-     * @param t new value
-     */
-    public void setT( String t )
-    {
-        m_t = t;
-    }
-
-
-    /**
-     * get the v tag.
-     * @return attribute v
-     */
-    public String getV()
-    {
-        return m_v;
-    }
-
-
-    /**
-     * set the v tag.
-     * @param v new value
-     */
-    public void setV( String v )
-    {
-        m_v = v;
-    }
-
-
-    /**
-     * transform this object to node.
-     * @param father father document for create Node
-     * @return node
-     */
-    public Node getNode( Document father )
-    {
-        Element p = father.createElement( "p" );
-        p.setAttribute( "n", getN() );
-        if ( getT() != null )
-        {
-            p.setAttribute( "t", getT() );
-        }
-
-        if ( getV() != null )
-        {
-            p.setAttribute( "v", getV() );
-        }
-
-        return p;
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/PomHelper.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/PomHelper.java
deleted file mode 100644
index 7d81e09..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/PomHelper.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.obr.plugin;
-
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-
-import org.apache.maven.model.Model;
-import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-
-
-/**
- * Maven POM helper methods.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public final class PomHelper
-{
-    public static MavenProject readPom( File pomFile ) throws MojoExecutionException
-    {
-        Reader reader = null;
-
-        try
-        {
-            reader = new FileReader( pomFile );
-            MavenXpp3Reader modelReader = new MavenXpp3Reader();
-            return new MavenProject( modelReader.read( reader ) );
-        }
-        catch ( FileNotFoundException e )
-        {
-            throw new MojoExecutionException( "Error reading specified POM file: " + e.getMessage(), e );
-        }
-        catch ( IOException e )
-        {
-            throw new MojoExecutionException( "Error reading specified POM file: " + e.getMessage(), e );
-        }
-        catch ( XmlPullParserException e )
-        {
-            throw new MojoExecutionException( "Error reading specified POM file: " + e.getMessage(), e );
-        }
-        finally
-        {
-            IOUtil.close( reader );
-        }
-    }
-
-
-    public static MavenProject buildPom( String groupId, String artifactId, String version, String packaging )
-    {
-        Model model = new Model();
-
-        model.setModelVersion( "4.0.0" );
-        model.setGroupId( groupId );
-        model.setArtifactId( artifactId );
-        model.setVersion( version );
-        model.setPackaging( packaging );
-
-        return new MavenProject( model );
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/RemoteFileManager.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/RemoteFileManager.java
deleted file mode 100644
index 4a01d21..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/RemoteFileManager.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.obr.plugin;
-
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Writer;
-
-import org.apache.maven.artifact.manager.WagonConfigurationException;
-import org.apache.maven.artifact.manager.WagonManager;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.settings.Proxy;
-import org.apache.maven.settings.Settings;
-import org.apache.maven.wagon.ConnectionException;
-import org.apache.maven.wagon.ResourceDoesNotExistException;
-import org.apache.maven.wagon.TransferFailedException;
-import org.apache.maven.wagon.UnsupportedProtocolException;
-import org.apache.maven.wagon.Wagon;
-import org.apache.maven.wagon.authentication.AuthenticationException;
-import org.apache.maven.wagon.authorization.AuthorizationException;
-import org.apache.maven.wagon.proxy.ProxyInfo;
-import org.apache.maven.wagon.repository.Repository;
-
-
-/**
- * this class is used to manage all connections by wagon.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class RemoteFileManager
-{
-    /**
-     * save the connection.
-     */
-    private Wagon m_wagon;
-
-    /**
-     * the wagon manager.
-     */
-    private WagonManager m_wagonManager;
-
-    /**
-     * the project settings.
-     */
-    private Settings m_settings;
-
-    /**
-     * logger instance.
-     */
-    private Log m_log;
-
-
-    /**
-     * initialize main information.
-     * @param wm WagonManager provides by maven
-     * @param settings settings of the current project provides by maven
-     * @param log logger
-     */
-    public RemoteFileManager( WagonManager wm, Settings settings, Log log )
-    {
-        m_wagonManager = wm;
-        m_settings = settings;
-        m_log = log;
-        m_wagon = null;
-    }
-
-
-    /**
-     * disconnect the current object.
-     */
-    public void disconnect()
-    {
-        try
-        {
-            if ( m_wagon != null )
-            {
-                m_wagon.disconnect();
-            }
-        }
-        catch ( ConnectionException e )
-        {
-            m_log.error( "Error disconnecting Wagon", e );
-        }
-    }
-
-
-    /**
-     * connect the current object to repository given in constructor.
-     * @param id repository id
-     * @param url repository url
-     * @throws MojoExecutionException
-     */
-    public void connect( String id, String url ) throws MojoExecutionException
-    {
-        Repository repository = new Repository( id, url );
-
-        try
-        {
-            m_wagon = m_wagonManager.getWagon( repository );
-        }
-        catch ( UnsupportedProtocolException e )
-        {
-            throw new MojoExecutionException( "Unsupported protocol: '" + repository.getProtocol() + "'", e );
-        }
-        catch ( WagonConfigurationException e )
-        {
-            throw new MojoExecutionException( "Unable to configure Wagon: '" + repository.getProtocol() + "'", e );
-        }
-
-        try
-        {
-            ProxyInfo proxyInfo = getProxyInfo( m_settings );
-            if ( proxyInfo != null )
-            {
-                m_wagon.connect( repository, m_wagonManager.getAuthenticationInfo( id ), proxyInfo );
-            }
-            else
-            {
-                m_wagon.connect( repository, m_wagonManager.getAuthenticationInfo( id ) );
-            }
-        }
-        catch ( ConnectionException e )
-        {
-            throw new MojoExecutionException( "Connection failed", e );
-        }
-        catch ( AuthenticationException e )
-        {
-            throw new MojoExecutionException( "Authentication failed", e );
-        }
-    }
-
-
-    /**
-     * get a file from the current repository connected.
-     * @param url url to the targeted file
-     * @param suffix suggested file suffix
-     * @return get a file descriptor on the required resource
-     * @throws MojoExecutionException
-     */
-    public File get( String url, String suffix ) throws MojoExecutionException
-    {
-        if ( m_wagon == null )
-        {
-            m_log.error( "must be connected first!" );
-            return null;
-        }
-
-        File file = null;
-        try
-        {
-            file = File.createTempFile( String.valueOf( System.currentTimeMillis() ), suffix );
-        }
-        catch ( IOException e )
-        {
-            throw new MojoExecutionException( "I/O problem", e );
-        }
-
-        try
-        {
-            m_wagon.get( url, file );
-        }
-        catch ( TransferFailedException e )
-        {
-            file.delete(); // cleanup on failure
-            throw new MojoExecutionException( "Transfer failed", e );
-        }
-        catch ( AuthorizationException e )
-        {
-            file.delete(); // cleanup on failure
-            throw new MojoExecutionException( "Authorization failed", e );
-        }
-        catch ( ResourceDoesNotExistException e )
-        {
-            file.delete(); // return non-existent file
-        }
-
-        return file;
-    }
-
-
-    /**
-     * put a file on the current repository connected.
-     * @param file file to upload
-     * @param url url to copy file
-     * @throws MojoExecutionException
-     */
-    public void put( File file, String url ) throws MojoExecutionException
-    {
-        if ( m_wagon == null )
-        {
-            m_log.error( "must be connected first!" );
-            return;
-        }
-
-        try
-        {
-            m_wagon.put( file, url );
-        }
-        catch ( TransferFailedException e )
-        {
-            throw new MojoExecutionException( "Transfer failed", e );
-        }
-        catch ( AuthorizationException e )
-        {
-            throw new MojoExecutionException( "Authorization failed", e );
-        }
-        catch ( ResourceDoesNotExistException e )
-        {
-            throw new MojoExecutionException( "Resource does not exist:" + file, e );
-        }
-    }
-
-
-    /**
-     * Convenience method to map a Proxy object from the user system settings to a ProxyInfo object.
-     * @param settings project settings given by maven
-     * @return a proxyInfo object instancied or null if no active proxy is define in the settings.xml
-     */
-    public static ProxyInfo getProxyInfo( Settings settings )
-    {
-        ProxyInfo proxyInfo = null;
-        if ( settings != null && settings.getActiveProxy() != null )
-        {
-            Proxy settingsProxy = settings.getActiveProxy();
-
-            proxyInfo = new ProxyInfo();
-            proxyInfo.setHost( settingsProxy.getHost() );
-            proxyInfo.setType( settingsProxy.getProtocol() );
-            proxyInfo.setPort( settingsProxy.getPort() );
-            proxyInfo.setNonProxyHosts( settingsProxy.getNonProxyHosts() );
-            proxyInfo.setUserName( settingsProxy.getUsername() );
-            proxyInfo.setPassword( settingsProxy.getPassword() );
-        }
-
-        return proxyInfo;
-    }
-
-
-    public void lockFile( String fileName, boolean ignoreLock ) throws MojoExecutionException
-    {
-        if ( !ignoreLock )
-        {
-            int countError = 0;
-            while ( isLockedFile( fileName ) && countError < 2 )
-            {
-                countError++;
-                m_log.warn( "File is currently locked, retry in 10s" );
-                try
-                {
-                    Thread.sleep( 10000 );
-                }
-                catch ( InterruptedException e )
-                {
-                    m_log.warn( "Sleep interrupted" );
-                }
-            }
-
-            if ( countError == 2 )
-            {
-                m_log.error( "File " + fileName + " is locked. Use -DignoreLock to force uploading" );
-                throw new MojoExecutionException( "Remote file locked" );
-            }
-        }
-
-        File file = null;
-        try
-        {
-            // create a non-empty file used to lock the remote file
-            file = File.createTempFile( String.valueOf( System.currentTimeMillis() ), ".lock" );
-
-            Writer writer = new BufferedWriter( new FileWriter( file ) );
-            writer.write( "LOCKED" );
-            writer.close();
-
-            put( file, fileName + ".lock" );
-        }
-        catch ( IOException e )
-        {
-            throw new MojoExecutionException( "I/O problem", e );
-        }
-        finally
-        {
-            if ( null != file )
-            {
-                file.delete();
-            }
-        }
-    }
-
-
-    public void unlockFile( String fileName ) throws MojoExecutionException
-    {
-        File file = null;
-        try
-        {
-            // clear the contents of the file used to lock the remote file
-            file = File.createTempFile( String.valueOf( System.currentTimeMillis() ), ".lock" );
-
-            Writer writer = new BufferedWriter( new FileWriter( file ) );
-            writer.write( " " ); // write 1 byte to force wagon upload
-            writer.close();
-
-            put( file, fileName + ".lock" );
-        }
-        catch ( IOException e )
-        {
-            throw new MojoExecutionException( "I/O problem", e );
-        }
-        finally
-        {
-            if ( null != file )
-            {
-                file.delete();
-            }
-        }
-    }
-
-
-    /**
-     * this method indicates if the targeted file is locked or not.
-     * @param remote connection manager
-     * @param fileName name targeted
-     * @return  true if the required file is locked, else false
-     * @throws MojoExecutionException
-     */
-    public boolean isLockedFile( String fileName ) throws MojoExecutionException
-    {
-        File file = null;
-        try
-        {
-            file = get( fileName + ".lock", ".lock" );
-
-            // file is locked with contents "LOCKED"
-            if ( null != file && file.length() <= 2 )
-            {
-                return false;
-            }
-        }
-        finally
-        {
-            if ( null != file )
-            {
-                file.delete();
-            }
-        }
-
-        return true;
-    }
-
-
-    public String toString()
-    {
-        return m_wagon.getRepository().getUrl();
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Require.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Require.java
deleted file mode 100644
index 370eb38..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/Require.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.obr.plugin;
-
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * this class store a Require tag.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class Require
-{
-
-    /**
-     * store the extend attribute.
-     */
-    private String m_extend;
-
-    /**
-     * store the multiple attribute.
-     */
-    private String m_multiple;
-
-    /**
-     * store the optional attribute.
-     */
-    private String m_optional;
-
-    /**
-     * store the name attribute.
-     */
-    private String m_name;
-
-    /**
-     * store the filter attribute.
-     */
-    private String m_filter;
-
-    /**
-     * store the value of the tag.
-     */
-    private String m_value;
-
-
-    /**
-     * get the extend attribute.
-     * @return a string which contains the value of the boolean
-     */
-    public String getExtend()
-    {
-        return m_extend;
-    }
-
-
-    /**
-     * set the extend attribute.
-     * @param extend new value for the extend attribute
-     */
-    public void setExtend( String extend )
-    {
-        m_extend = extend;
-    }
-
-
-    /**
-     * get the filter attribute.
-     * @return m_filter value
-     */
-    public String getFilter()
-    {
-        return m_filter;
-    }
-
-
-    /**
-     * set the filter attribute.
-     * @param filter new value for filter
-     */
-    public void setFilter( String filter )
-    {
-        m_filter = filter;
-    }
-
-
-    /**
-     * get multiple attribute.
-     * @return m_multiple value
-     */
-    public String getMultiple()
-    {
-        return m_multiple;
-    }
-
-
-    /**
-     * set multiple attribute.
-     * @param multiple new value for m_multiple
-     */
-    public void setMultiple( String multiple )
-    {
-        m_multiple = multiple;
-    }
-
-
-    /**
-     * get name attribute.
-     * @return m_name value
-     */
-    public String getName()
-    {
-        return m_name;
-    }
-
-
-    /**
-     * set name attribute.
-     * @param name new value for m_name
-     */
-    public void setName( String name )
-    {
-        m_name = name;
-    }
-
-
-    /**
-     * get the optional attribute.
-     * @return m_optional value
-     */
-    public String getOptional()
-    {
-        return m_optional;
-    }
-
-
-    /**
-     * set the optional attribute.
-     * @param optionnal new value for m_optional
-     */
-    public void setOptional( String optionnal )
-    {
-        m_optional = optionnal;
-    }
-
-
-    /**
-     * get value of the tag.
-     * @return value of this tag
-     */
-    public String getValue()
-    {
-        return m_value;
-    }
-
-
-    /**
-     * set the value of the tag.
-     * @param value new value for this tag
-     */
-    public void setValue( String value )
-    {
-        m_value = value;
-    }
-
-
-    /**
-     * transform this object to Node.
-     * 
-     * @param father father document for create Node
-     * @return node
-     */
-    public Node getNode( Document father )
-    {
-        Element require = father.createElement( "require" );
-        require.setAttribute( "name", getName() );
-        require.setAttribute( "filter", getFilter() );
-        require.setAttribute( "extend", getExtend() );
-        require.setAttribute( "multiple", getMultiple() );
-        require.setAttribute( "optional", getOptional() );
-        XmlHelper.setTextContent( require, getValue() );
-
-        return require;
-    }
-
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ResourcesBundle.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ResourcesBundle.java
deleted file mode 100644
index 1e5f01d..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/ResourcesBundle.java
+++ /dev/null
@@ -1,672 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.obr.plugin;
-
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * this class describe all information by bundle.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ResourcesBundle
-{
-    /**
-     * store the bundle symbolic name.
-     */
-    private String m_symbolicName;
-
-    /**
-     * store the bundle presentation name.
-     */
-    private String m_presentationName;
-
-    /**
-     * store the bundle version.
-     */
-    private String m_version;
-
-    /**
-     * store the bundle URI.
-     */
-    private String m_uri;
-
-    /**
-     * store the bundle description.
-     */
-    private String m_description;
-
-    /**
-     * store the bundle size.
-     */
-    private String m_size;
-
-    /**
-     * store the bundle documentation.
-     */
-    private String m_documentation;
-
-    /**
-     * store the bundle source.
-     */
-    private String m_source;
-
-    /**
-     * store the bundle license.
-     */
-    private String m_license;
-
-    /**
-     * store the bundle id.
-     */
-    private String m_id;
-
-    /**
-     * store the bundle categories.
-     */
-    private List m_category = new ArrayList();
-
-    /**
-     * store the bundle capabilities.
-     */
-    private List m_capability = new ArrayList();
-
-    /**
-     * store the bundle requirement.
-     */
-    private List m_require = new ArrayList();
-
-    /**
-     * get the plugin logger.
-     */
-    private Log m_logger;
-
-
-    /**
-     * initialize logger.
-     * @param log log use by plugin
-     */
-    public ResourcesBundle( Log log )
-    {
-        m_logger = log;
-    }
-
-
-    public List getCapability()
-    {
-        return m_capability;
-    }
-
-
-    public void setCapability( List capability )
-    {
-        m_capability = capability;
-    }
-
-
-    public List getCategory()
-    {
-        return m_category;
-    }
-
-
-    public void setCategory( List category )
-    {
-        m_category = category;
-    }
-
-
-    public String getLicense()
-    {
-        return m_license;
-    }
-
-
-    public void setLicense( String license )
-    {
-        m_license = license;
-    }
-
-
-    public String getDescription()
-    {
-        return m_description;
-    }
-
-
-    public void setDescription( String description )
-    {
-        m_description = description;
-    }
-
-
-    public String getDocumentation()
-    {
-        return m_documentation;
-    }
-
-
-    public void setDocumentation( String documentation )
-    {
-        m_documentation = documentation;
-    }
-
-
-    public String getPresentationName()
-    {
-        return m_presentationName;
-    }
-
-
-    public void setPresentationName( String name )
-    {
-        m_presentationName = name;
-    }
-
-
-    public String getSize()
-    {
-        return m_size;
-    }
-
-
-    public void setSize( String size )
-    {
-        m_size = size;
-    }
-
-
-    public String getSymbolicName()
-    {
-        return m_symbolicName;
-    }
-
-
-    public void setSymbolicName( String name )
-    {
-        m_symbolicName = name;
-    }
-
-
-    public String getUri()
-    {
-        return m_uri;
-    }
-
-
-    public void setUri( String url )
-    {
-        m_uri = url;
-    }
-
-
-    public String getVersion()
-    {
-        return m_version;
-    }
-
-
-    public void setVersion( String version )
-    {
-        m_version = version;
-    }
-
-
-    public List getRequire()
-    {
-        return m_require;
-    }
-
-
-    public void setRequire( List require )
-    {
-        m_require = require;
-    }
-
-
-    public String getSource()
-    {
-        return m_source;
-    }
-
-
-    public void setSource( String source )
-    {
-        m_source = source;
-    }
-
-
-    public String getId()
-    {
-        return m_id;
-    }
-
-
-    public void setId( String id )
-    {
-        m_id = id;
-    }
-
-
-    /**
-     * add a new capability for this bundle description.
-     * @param capability the Capability to add
-     */
-    public void addCapability( Capability capability )
-    {
-        m_capability.add( capability );
-    }
-
-
-    /**
-     * add a new requirement for this bundle description.
-     * @param require th Require to add
-     */
-    public void addRequire( Require require )
-    {
-        m_require.add( require );
-    }
-
-
-    /**
-     * add a new category for this bundle decription.
-     * @param category the Category to add
-     */
-    public void addCategory( Category category )
-    {
-        m_category.add( category );
-    }
-
-
-    /**
-     * transform this object to Node.
-     * tranform all sub-object to node also
-     * @param father father document for create Node
-     * @return node
-     */
-    public Node getNode( Document father )
-    {
-        // return the complete resource tree
-        if ( !isValid() || getId() == null )
-        {
-            m_logger.error( "those properties was not defined:" + getInvalidProperties() );
-            return null;
-        }
-
-        Element resource = father.createElement( "resource" );
-        Element description = father.createElement( "description" );
-        Element size = father.createElement( "size" );
-        Element documentation = father.createElement( "documentation" );
-        Element source = father.createElement( "source" );
-        Element license = father.createElement( "license" );
-
-        resource.setAttribute( "id", getId() );
-        resource.setAttribute( "symbolicname", getSymbolicName() );
-        resource.setAttribute( "presentationname", getPresentationName() );
-        resource.setAttribute( "uri", getUri() );
-        resource.setAttribute( "version", getVersion() );
-
-        XmlHelper.setTextContent( description, getDescription() );
-        resource.appendChild( description );
-
-        XmlHelper.setTextContent( size, getSize() );
-        resource.appendChild( size );
-
-        if ( getDocumentation() != null )
-        {
-            XmlHelper.setTextContent( documentation, getDocumentation() );
-            resource.appendChild( documentation );
-        }
-
-        if ( getSource() != null )
-        {
-            XmlHelper.setTextContent( source, getSource() );
-            resource.appendChild( source );
-        }
-
-        if ( getLicense() != null )
-        {
-            XmlHelper.setTextContent( license, getLicense() );
-            resource.appendChild( license );
-        }
-
-        List list = getNodeCategories( father );
-        for ( int i = 0; i < list.size(); i++ )
-        {
-            resource.appendChild( ( Node ) list.get( i ) );
-        }
-
-        list = getNodeCapabilities( father );
-        for ( int i = 0; i < list.size(); i++ )
-        {
-            resource.appendChild( ( Node ) list.get( i ) );
-        }
-
-        list = getNodeRequirement( father );
-        for ( int i = 0; i < list.size(); i++ )
-        {
-            resource.appendChild( ( Node ) list.get( i ) );
-        }
-
-        return resource;
-    }
-
-
-    /**
-     * this method gets information form pom.xml to complete missing data from those given by user.
-     * @param project project information given by maven
-     * @param ebi bundle information extracted from bindex
-     * @return true
-     */
-    public boolean construct( MavenProject project, ExtractBindexInfo ebi )
-    {
-
-        if ( ebi.getPresentationName() != null )
-        {
-            setPresentationName( ebi.getPresentationName() );
-            if ( project.getName() != null )
-            {
-                m_logger.debug( "pom property override:<presentationname> " + project.getName() );
-            }
-        }
-        else
-        {
-            setPresentationName( project.getName() );
-        }
-
-        if ( ebi.getSymbolicName() != null )
-        {
-            setSymbolicName( ebi.getSymbolicName() );
-            if ( project.getArtifactId() != null )
-            {
-                m_logger.debug( "pom property override:<symbolicname> " + project.getArtifactId() );
-            }
-        }
-        else
-        {
-            setSymbolicName( project.getArtifactId() );
-        }
-
-        if ( ebi.getVersion() != null )
-        {
-            setVersion( ebi.getVersion() );
-            if ( project.getVersion() != null )
-            {
-                m_logger.debug( "pom property override:<version> " + project.getVersion() );
-            }
-        }
-        else
-        {
-            setVersion( project.getVersion() );
-        }
-
-        if ( ebi.getId() != null )
-        {
-            setId( ebi.getId() );
-        }
-
-        if ( ebi.getDescription() != null )
-        {
-            setDescription( ebi.getDescription() );
-            if ( project.getDescription() != null )
-            {
-                m_logger.debug( "pom property override:<description> " + project.getDescription() );
-            }
-        }
-        else
-        {
-            setDescription( project.getDescription() );
-        }
-
-        if ( ebi.getDocumentation() != null )
-        {
-            setDocumentation( ebi.getDocumentation() );
-            if ( project.getUrl() != null )
-            {
-                m_logger.debug( "pom property override:<documentation> " + project.getUrl() );
-            }
-        }
-        else
-        {
-            setDocumentation( project.getUrl() );
-        }
-
-        if ( ebi.getSource() != null )
-        {
-            setSource( ebi.getSource() );
-            if ( project.getScm() != null )
-            {
-                m_logger.debug( "pom property override:<source> " + project.getScm() );
-            }
-        }
-        else
-        {
-            String src = null;
-            if ( project.getScm() != null )
-            {
-                src = project.getScm().getUrl();
-            }
-            setSource( src );
-        }
-
-        if ( ebi.getLicense() != null )
-        {
-            setLicense( ebi.getLicense() );
-            String lic = null;
-            List l = project.getLicenses();
-            Iterator it = l.iterator();
-            while ( it.hasNext() )
-            {
-                if ( it.next() != null )
-                {
-                    m_logger.debug( "pom property override:<license> " + lic );
-                    break;
-                }
-            }
-        }
-        else
-        {
-            String lic = null;
-            List l = project.getLicenses();
-            Iterator it = l.iterator();
-            while ( it.hasNext() )
-            {
-                lic = it.next() + ";";
-            }
-
-            setLicense( lic );
-        }
-
-        // create the first capability (ie : bundle)
-        Capability capability = new Capability();
-        capability.setName( "bundle" );
-        PElement p = new PElement();
-        p.setN( "manifestversion" );
-        p.setV( "2" );
-        capability.addP( p );
-
-        p = new PElement();
-        p.setN( "presentationname" );
-        p.setV( getPresentationName() );
-        capability.addP( p );
-
-        p = new PElement();
-        p.setN( "symbolicname" );
-        p.setV( getSymbolicName() );
-        capability.addP( p );
-
-        p = new PElement();
-        p.setN( "version" );
-        p.setT( "version" );
-        p.setV( getVersion() );
-        capability.addP( p );
-
-        addCapability( capability );
-
-        List capabilities = ebi.getCapabilities();
-        for ( int i = 0; i < capabilities.size(); i++ )
-        {
-            addCapability( ( Capability ) capabilities.get( i ) );
-        }
-
-        List requirement = ebi.getRequirement();
-        for ( int i = 0; i < requirement.size(); i++ )
-        {
-            addRequire( ( Require ) requirement.get( i ) );
-        }
-
-        // we also add the goupId
-        Category category = new Category();
-        category.setId( project.getGroupId() );
-        addCategory( category );
-
-        return true;
-    }
-
-
-    /**
-     * return if the bundle resource is complete.
-     * @return false if an information is missing, else true
-     */
-    public boolean isValid()
-    {
-        // we must verify required properties are present
-        return getPresentationName() != null && getSymbolicName() != null && getVersion() != null && getUri() != null
-            && getSize() != null;
-    }
-
-
-    /**
-     * test if this bundle has the same symbolicname, and version number.
-     * @param symbolicName symbolicName to compare with current bundle
-     * @param presentationName presentationName to compare with current bundlde
-     * @param version version to compare with current bundle
-     * @return true if the information are the same, else false
-     */
-    public boolean isSameBundleResource( String symbolicName, String version )
-    {
-        if ( isValid() )
-        {
-            return ( symbolicName.compareTo( getSymbolicName() ) == 0 ) && ( version.compareTo( getVersion() ) == 0 );
-        }
-
-        return false;
-    }
-
-
-    /**
-     * return a list of categories transformed to node.
-     * @param father father document to create node from same document
-     * @return List of Node
-     */
-    private List getNodeCategories( Document father )
-    {
-        List listNode = new ArrayList();
-        List listCategory = getCategory();
-        for ( int i = 0; i < listCategory.size(); i++ )
-        {
-            listNode.add( ( ( Category ) listCategory.get( i ) ).getNode( father ) );
-        }
-        return listNode;
-    }
-
-
-    /**
-     * return a list of capabilities transformed to node.
-     * @param father father document to create node from same document
-     * @return List of Node
-     */
-    private List getNodeCapabilities( Document father )
-    {
-        List listNode = new ArrayList();
-        List listCapability = getCapability();
-        for ( int i = 0; i < listCapability.size(); i++ )
-        {
-            listNode.add( ( ( Capability ) listCapability.get( i ) ).getNode( father ) );
-        }
-        return listNode;
-    }
-
-
-    /**
-     * return a list of requirement transformed to node.
-     * @param father father document to create node from same document
-     * @return List of Node.
-     */
-    private List getNodeRequirement( Document father )
-    {
-        List listNode = new ArrayList();
-        List listRequirement = getRequire();
-        for ( int i = 0; i < listRequirement.size(); i++ )
-        {
-            listNode.add( ( ( Require ) listRequirement.get( i ) ).getNode( father ) );
-        }
-        return listNode;
-    }
-
-
-    /**
-     * return the list of properties not define in this bundle resource.
-     * @return list of properties not define
-     */
-    private String getInvalidProperties()
-    {
-        if ( isValid() )
-        {
-            if ( getId() == null )
-            {
-                return "id";
-            }
-
-            return "";
-        }
-        String result = "";
-        if ( getPresentationName() == null )
-        {
-            result = result + "presentationName;";
-        }
-        if ( getSymbolicName() == null )
-        {
-            result = result + "symbolicName;";
-        }
-        if ( getVersion() == null )
-        {
-            result = result + "version;";
-        }
-        if ( getUri() == null )
-        {
-            result = result + "Uri;";
-        }
-        if ( getSize() == null )
-        {
-            result = result + "Size";
-        }
-        return result;
-    }
-
-}
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/XmlHelper.java b/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/XmlHelper.java
deleted file mode 100644
index 5ad06fb..0000000
--- a/maven-obr-plugin/src/main/java/org/apache/felix/obr/plugin/XmlHelper.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.obr.plugin;
-
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * Provide XML helper methods to support pre-Java5 runtimes
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class XmlHelper
-{
-    /**
-     * based on public Java5 javadoc of org.w3c.dom.Node.getTextContent method
-     */
-    public static String getTextContent( Node node )
-    {
-        switch ( node.getNodeType() )
-        {
-            case Node.ELEMENT_NODE:
-            case Node.ATTRIBUTE_NODE:
-            case Node.ENTITY_NODE:
-            case Node.ENTITY_REFERENCE_NODE:
-            case Node.DOCUMENT_FRAGMENT_NODE:
-                return mergeTextContent( node.getChildNodes() );
-            case Node.TEXT_NODE:
-            case Node.CDATA_SECTION_NODE:
-            case Node.COMMENT_NODE:
-            case Node.PROCESSING_INSTRUCTION_NODE:
-                return node.getNodeValue();
-            case Node.DOCUMENT_NODE:
-            case Node.DOCUMENT_TYPE_NODE:
-            case Node.NOTATION_NODE:
-            default:
-                return null;
-        }
-    }
-
-
-    /**
-     * based on the following quote from public Java5 javadoc of org.w3c.dom.Node.getTextContent method:
-     * 
-     * "concatenation of the textContent attribute value of every child node, excluding COMMENT_NODE and
-     * PROCESSING_INSTRUCTION_NODE nodes. This is the empty string if the node has no children"
-     */
-    private static String mergeTextContent( NodeList nodes )
-    {
-        StringBuffer buf = new StringBuffer();
-        for ( int i = 0; i < nodes.getLength(); i++ )
-        {
-            Node n = nodes.item( i );
-            final String text;
-
-            switch ( n.getNodeType() )
-            {
-                case Node.COMMENT_NODE:
-                case Node.PROCESSING_INSTRUCTION_NODE:
-                    text = null;
-                    break;
-                default:
-                    text = getTextContent( n );
-                    break;
-            }
-
-            if ( text != null )
-            {
-                buf.append( text );
-            }
-        }
-        return buf.toString();
-    }
-
-
-    /**
-     * based on public Java5 javadoc of org.w3c.dom.Node.setTextContent method
-     */
-    public static void setTextContent( Node node, final String text )
-    {
-        while ( node.hasChildNodes() )
-        {
-            node.removeChild( node.getFirstChild() );
-        }
-
-        if ( text != null && text.length() > 0 )
-        {
-            Node textNode = node.getOwnerDocument().createTextNode( text );
-            node.appendChild( textNode );
-        }
-    }
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/BundleInfo.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/BundleInfo.java
deleted file mode 100644
index 2e68a9a..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/BundleInfo.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * $Id: BundleInfo.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import java.io.*;
-import java.net.URL;
-import java.util.*;
-import java.util.zip.*;
-
-import org.osgi.service.obr.Resource;
-
-/**
- * Convert a bundle to a generic resource description and store its local
- * dependencies (like for example a license file in the JAR) in a zip file.
- * 
- * @version $Revision: 44 $
- */
-public class BundleInfo {
-	Manifest	manifest;
-	File		bundleJar;
-	ZipFile		jar;
-	String		license;
-	Properties	localization;
-	RepositoryImpl	repository;
-
-	/**
-	 * Parse a zipFile from the file system. We only need the manifest and the
-	 * localization. So a zip file is used to minimze memory consumption.
-	 * 
-	 * @param bundleJar Path name
-	 * @throws Exception Any errors that occur
-	 */
-	public BundleInfo(RepositoryImpl repository, File bundleJar) throws Exception {
-		this.bundleJar = bundleJar;
-		this.repository = repository;
-		
-		if (!this.bundleJar.exists())
-			throw new FileNotFoundException(bundleJar.toString());
-
-		jar = new ZipFile(bundleJar);
-		ZipEntry entry = jar.getEntry("META-INF/MANIFEST.MF");
-		if (entry == null)
-			throw new FileNotFoundException("No Manifest in "
-					+ bundleJar.toString());
-		manifest = new Manifest(jar.getInputStream(entry));
-	}
-
-	public BundleInfo(Manifest manifest) throws Exception {
-		this.manifest = manifest;
-	}
-
-	/**
-	 * Convert the bundle to a Resource. All URIs are going to be abslute, but
-	 * could be local.
-	 * 
-	 * @return the resource
-	 * @throws Exception
-	 */
-	public ResourceImpl build() throws Exception {
-		ResourceImpl resource;
-		// Setup the manifest
-		// and create a resource
-		resource = new ResourceImpl(repository, manifest.getSymbolicName(), manifest
-				.getVersion());
-
-		try {
-
-			// Calculate the location URL of the JAR
-			URL location = new URL("jar:" + bundleJar.toURL().toString() + "!/");
-			resource.setURL(bundleJar.toURL());
-			resource.setFile(bundleJar);
-
-			doReferences(resource, location);
-			doSize(resource);
-			doCategories(resource);
-			doImportExportServices(resource);
-			doDeclarativeServices(resource);
-			doFragment(resource);
-			doRequires(resource);
-			doBundle(resource);
-			doExports(resource);
-			doImports(resource);
-			doExecutionEnvironment(resource);
-
-			return resource;
-		}
-		finally {
-			try {
-				jar.close();
-			}
-			catch (Exception e) {
-				// ignore
-			}
-		}
-	}
-
-	/**
-	 * Check the size and add it.
-	 * 
-	 * @param resource
-	 */
-	void doSize(ResourceImpl resource) {
-		long size = bundleJar.length();
-		if (size > 0)
-			resource.setSize(size);
-	}
-
-	/**
-	 * Find the categories, break them up and add them.
-	 * 
-	 * @param resource
-	 */
-	void doCategories(ResourceImpl resource) {
-		for (int i = 0; i < manifest.getCategories().length; i++) {
-			String category = manifest.getCategories()[i];
-			resource.addCategory(category);
-		}
-	}
-
-	void doReferences(ResourceImpl resource, URL location) {
-		// Presentation name
-		String name = translated("Bundle-Name");
-		if (name != null)
-			resource.setPresentationName(name);
-
-		// Handle license. -l allows a global license
-		// set when no license is included.
-
-		String license = translated("Bundle-License");
-		if (license != null)
-			resource.setLicense(toURL(location, license));
-		else if (this.license != null)
-			resource.setLicense(toURL(location, this.license));
-
-		String description = translated("Bundle-Description");
-		if (description != null)
-			resource.setDescription(description);
-
-		String copyright = translated("Bundle-Copyright");
-		if (copyright != null)
-			resource.setCopyright(copyright);
-
-		String documentation = translated("Bundle-DocURL");
-		if (documentation != null)
-			resource.setDocumentation(toURL(location, documentation));
-
-		String source = manifest.getValue("Bundle-Source");
-		if (source != null)
-			resource.setSource(toURL(location, source));
-	}
-
-	URL toURL(URL location, String source) {
-		try {
-			return new URL(location, source);
-		}
-		catch (Exception e) {
-			System.err.println("Error in converting url: " + location + " : "
-					+ source);
-			return null;
-		}
-	}
-
-	void doDeclarativeServices(ResourceImpl resource) throws Exception {
-		String serviceComponent = manifest.getValue("service-component");
-		if (serviceComponent == null)
-			return;
-
-		StringTokenizer st = new StringTokenizer(serviceComponent, " ,\t");
-		String parts[] = new String[st.countTokens()];
-		for (int i = 0; i < parts.length; i++)
-			parts[i] = st.nextToken();
-
-		for (int i = 0; i < parts.length; i++) {
-			ZipEntry entry = jar.getEntry(parts[i]);
-			if (entry == null) {
-				System.err.println("Bad Service-Component header: "
-						+ serviceComponent + ", no such file " + parts[i]);
-			}
-			InputStream in = jar.getInputStream(entry);
-			// TODO parse declarative services files.
-			in.close();
-		}
-	}
-
-	void doImportExportServices(ResourceImpl resource) throws IOException {
-		String importServices = manifest.getValue("import-service");
-		if (importServices != null) {
-			List entries = manifest.getEntries(importServices);
-			for (Iterator i = entries.iterator(); i.hasNext();) {
-				ManifestEntry entry = (ManifestEntry) i.next();
-				RequirementImpl ri = new RequirementImpl("service");
-				ri.setFilter(createServiceFilter(entry));
-				ri.setComment("Import Service " + entry.getName());
-
-				// TODO the following is arbitrary
-				ri.setOptional(false);
-				ri.setMultiple(true);
-				resource.addRequirement(ri);
-			}
-		}
-
-		String exportServices = manifest.getValue("export-service");
-		if (exportServices != null) {
-			List entries = manifest.getEntries(exportServices);
-			for (Iterator i = entries.iterator(); i.hasNext();) {
-				ManifestEntry entry = (ManifestEntry) i.next();
-				CapabilityImpl cap = createServiceCapability(entry);
-				resource.addCapability(cap);
-			}
-		}
-	}
-
-	String translated(String key) {
-		return translate(manifest.getValue(key));
-	}
-
-	void doFragment(ResourceImpl resource) {
-		// Check if we are a fragment
-		ManifestEntry entry = manifest.getHost();
-		if (entry == null) {
-			return;
-		}
-		else {
-			// We are a fragment, create a requirement
-			// to our host.
-			RequirementImpl r = new RequirementImpl("bundle");
-			StringBuffer sb = new StringBuffer();
-			sb.append("(&(symbolicname=");
-			sb.append(entry.getName());
-			sb.append(")(version>=");
-			sb.append(entry.getVersion());
-			sb.append("))");
-			r.setFilter(sb.toString());
-			r.setComment("Required Host " + entry.getName() );
-			r.setExtend(true);
-			r.setOptional(false);
-			r.setMultiple(false);
-			resource.addRequirement(r);
-
-			// And insert a capability that we are available
-			// as a fragment. ### Do we need that with extend?
-			CapabilityImpl capability = new CapabilityImpl("fragment");
-			capability.addProperty("host", entry.getName());
-			capability.addProperty("version", entry.getVersion());
-			resource.addCapability(capability);
-		}
-	}
-
-	void doRequires(ResourceImpl resource) {
-		List entries = manifest.getRequire();
-		if (entries == null)
-			return;
-
-		for (Iterator i = entries.iterator(); i.hasNext();) {
-			ManifestEntry entry = (ManifestEntry) i.next();
-			RequirementImpl r = new RequirementImpl("bundle");
-
-			StringBuffer sb = new StringBuffer();
-			sb.append("(&(symbolicname=");
-			sb.append(entry.getName());
-			sb.append(")(version>=");
-			sb.append(entry.getVersion());
-			sb.append("))");
-			r.setFilter(sb.toString());
-			r.setComment("Require Bundle " + entry.getName() + "; "
-					+ entry.getVersion());
-			if (entry.directives == null
-					|| "true".equalsIgnoreCase((String) entry.directives
-							.get("resolution")))
-				r.setOptional(false);
-			else
-				r.setOptional(true);
-			resource.addRequirement(r);
-		}
-	}
-
-	void doExecutionEnvironment(ResourceImpl resource) {
-		String[] parts = manifest.getRequiredExecutionEnvironments();
-		if (parts == null)
-			return;
-
-		StringBuffer sb = new StringBuffer();
-		sb.append("(|");
-		for (int i = 0; i < parts.length; i++) {
-			String part = parts[i];
-			sb.append("(ee=");
-			sb.append(part);
-			sb.append(")");
-		}
-		sb.append(")");
-
-		RequirementImpl req = new RequirementImpl("ee");
-		req.setFilter(sb.toString());
-		req.setComment("Execution Environment " + sb.toString());
-		resource.addRequirement(req);
-	}
-
-	void doImports(ResourceImpl resource) {
-		List requirements = new ArrayList();
-		List packages = manifest.getImports();
-		if (packages == null)
-			return;
-
-		for (Iterator i = packages.iterator(); i.hasNext();) {
-			ManifestEntry pack = (ManifestEntry) i.next();
-			RequirementImpl requirement = new RequirementImpl("package");
-
-			createImportFilter(requirement, "package", pack);
-			requirement.setComment("Import package " + pack);
-			requirements.add(requirement);
-		}
-		for (Iterator i = requirements.iterator(); i.hasNext();)
-			resource.addRequirement((RequirementImpl) i.next());
-	}
-
-	String createServiceFilter(ManifestEntry pack) {
-		StringBuffer filter = new StringBuffer();
-		filter.append("(service=");
-		filter.append(pack.getName());
-		filter.append(")");
-		return filter.toString();
-	}
-
-	void createImportFilter(RequirementImpl req, String name, ManifestEntry pack) {
-		StringBuffer filter = new StringBuffer();
-		filter.append("(&(");
-		filter.append(name);
-		filter.append("=");
-		filter.append(pack.getName());
-		filter.append(")");
-		VersionRange version = pack.getVersion();
-		if (version != null) {
-			if ( version.isRange() ) {
-				filter.append("(version");
-				filter.append(">");
-				if (version.includeLow())
-					filter.append("=");
-				filter.append(version.low);
-				filter.append(")");
-
-				filter.append("(version");
-				filter.append("<");
-				if (version.includeHigh())
-					filter.append("=");
-				filter.append(version.high);
-				filter.append(")");
-			}
-			else {
-				filter.append("(version>=");
-				filter.append(pack.getVersion());
-				filter.append(")");
-			}
-		}
-		Map attributes = pack.getAttributes();
-		Set attrs = doImportPackageAttributes(req, filter, attributes);
-		if (attrs.size() > 0) {
-			String del = "";
-			filter.append("(mandatory:<*");
-			for (Iterator i = attrs.iterator(); i.hasNext();) {
-				filter.append(del);
-				filter.append(i.next());
-				del = ", ";
-			}
-			filter.append(")");
-		}
-		filter.append(")");
-		req.setFilter(filter.toString());
-	}
-
-	Set doImportPackageAttributes(RequirementImpl req, StringBuffer filter,
-			Map attributes) {
-		HashSet set = new HashSet();
-
-		if (attributes != null)
-			for (Iterator i = attributes.keySet().iterator(); i.hasNext();) {
-				String attribute = (String) i.next();
-				String value = (String) attributes.get(attribute);
-				if (attribute.equalsIgnoreCase("specification-version")
-						|| attribute.equalsIgnoreCase("version"))
-					continue;
-				else if (attribute.equalsIgnoreCase("resolution:")) {
-					req.setOptional(value.equalsIgnoreCase("optional"));
-				}
-				if (attribute.endsWith(":")) {
-					// Ignore
-				}
-				else {
-					filter.append("(");
-					filter.append(attribute);
-					filter.append("=");
-					filter.append(attributes.get(attribute));
-					filter.append(")");
-					set.add(attribute);
-				}
-			}
-		return set;
-	}
-
-	void doBundle(ResourceImpl resource) {
-		CapabilityImpl capability = new CapabilityImpl("bundle");
-		capability.addProperty("symbolicname", manifest.getSymbolicName());
-		if (manifest.getValue("Bundle-Name") != null)
-			capability.addProperty(
-					Resource.PRESENTATION_NAME,
-					translated("Bundle-Name"));
-		capability.addProperty("version", manifest.getVersion());
-		capability
-				.addProperty("manifestversion", manifest.getManifestVersion());
-
-		/**
-		 * Is this needed TODO
-		 */
-		ManifestEntry host = manifest.getHost();
-		if (host != null) {
-			capability.addProperty("host", host.getName());
-			if (host.getVersion() != null)
-				capability.addProperty("version", host.getVersion());
-		}
-		resource.addCapability(capability);
-	}
-
-	void doExports(ResourceImpl resource) {
-		List capabilities = new ArrayList();
-		List packages = manifest.getExports();
-		if (packages != null) {
-			for (Iterator i = packages.iterator(); i.hasNext();) {
-				ManifestEntry pack = (ManifestEntry) i.next();
-				CapabilityImpl capability = createCapability("package", pack);
-				capabilities.add(capability);
-			}
-        }
-		for (Iterator i = capabilities.iterator(); i.hasNext();)
-			resource.addCapability((CapabilityImpl) i.next());
-	}
-
-	CapabilityImpl createServiceCapability(ManifestEntry pack) {
-		CapabilityImpl capability = new CapabilityImpl("service");
-		capability.addProperty("service", pack.getName());
-		return capability;
-	}
-
-	CapabilityImpl createCapability(String name, ManifestEntry pack) {
-		CapabilityImpl capability = new CapabilityImpl(name);
-		capability.addProperty(name, pack.getName());
-		capability.addProperty("version", pack.getVersion());
-		Map attributes = pack.getAttributes();
-		if (attributes != null)
-			for (Iterator at = attributes.keySet().iterator(); at.hasNext();) {
-				String key = (String) at.next();
-				if (key.equalsIgnoreCase("specification-version")
-						|| key.equalsIgnoreCase("version"))
-					continue;
-				else {
-					Object value = attributes.get(key);
-					capability.addProperty(key, value);
-				}
-			}
-		return capability;
-	}
-
-	String translate(String s) {
-		if (s == null)
-			return null;
-
-		if (!s.startsWith("%")) {
-			return s;
-		}
-
-		if (localization == null)
-			try {
-				localization = new Properties();
-				String path = manifest
-						.getValue("Bundle-Localization", "bundle");
-				path += ".properties";
-				InputStream in = jar.getInputStream(new ZipEntry(path));
-				if (in != null) {
-					localization.load(in);
-					in.close();
-				}
-			}
-			catch (IOException e) {
-				e.printStackTrace();
-			}
-		s = s.substring(1);
-		return localization.getProperty(s, s);
-	}
-
-	File getZipFile() {
-		return bundleJar;
-	}
-}
\ No newline at end of file
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/CapabilityImpl.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/CapabilityImpl.java
deleted file mode 100644
index 45d2d1b..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/CapabilityImpl.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * $Id: CapabilityImpl.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import java.util.*;
-
-import org.osgi.service.obr.Capability;
-import org.xmlpull.v1.XmlPullParser;
-
-
-
-public class CapabilityImpl implements Capability {
-	String				name;
-	Map	properties	= new TreeMap();
-
-	public CapabilityImpl(String name) {
-		this.name = name;
-	}
-
-	public CapabilityImpl(XmlPullParser parser) throws Exception {
-		parser.require(XmlPullParser.START_TAG, null, "capability");
-		name = parser.getAttributeValue(null,"name");
-		while ( parser.nextTag() == XmlPullParser.START_TAG ) {
-			if ( parser.getName().equals("p")) {
-				String name = parser.getAttributeValue(null,"n");
-				String value = parser.getAttributeValue(null,"v");
-				String type = parser.getAttributeValue(null,"t");
-				Object v = value;
-
-				if ( "nummeric".equals(type))
-					v = new Long(value);
-				else if ( "version".equals(type))
-					v = new VersionRange(value);
-				addProperty(name,v);
-			}
-			parser.next();
-			parser.require(XmlPullParser.END_TAG, null, "p" );
-		}
-		parser.require(XmlPullParser.END_TAG, null, "capability" );
-	}
-
-
-	public void addProperty(String key, Object value) {
-		List values = (List) properties.get(key);
-		if (values == null) {
-			values = new ArrayList();
-			properties.put(key, values);
-		}
-		values.add(value);
-	}
-
-	public Tag toXML() {
-		return toXML(this);
-	}
-	
-	public static Tag toXML(Capability capability) {
-		Tag tag = new Tag("capability");
-		tag.addAttribute("name", capability.getName());
-		Map properties = capability.getProperties();
-		for ( Iterator k= properties.keySet().iterator(); k.hasNext(); ) {
-			String key = (String) k.next();
-			List values = (List) properties.get(key);
-			for ( Iterator v = values.iterator(); v.hasNext(); ) {
-				Object value = v.next();
-				Tag p = new Tag("p");
-				tag.addContent(p);
-				p.addAttribute("n", key);
-				if ( value != null )
-					p.addAttribute("v", value.toString());
-				else
-					System.out.println("Missing value " + key);
-				String type = null;
-				if (value instanceof Number )
-					type = "number";
-				else if (value.getClass() == VersionRange.class)
-					type = "version";
-				if (type != null)
-					p.addAttribute("t", type);
-			}
-		}
-		return tag;
-	}
-
-
-	public String getName() {
-		return name;
-	}
-
-
-	public Map getProperties() {
-		return properties;
-	}
-
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/FilterImpl.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/FilterImpl.java
deleted file mode 100644
index bc12314..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/FilterImpl.java
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * $Id: FilterImpl.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) 2000 Gatespace AB. All Rights Reserved.
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import java.lang.reflect.*;
-import java.math.BigInteger;
-import java.util.*;
-
-public class FilterImpl {
-	final char		WILDCARD	= 65535;
-
-	final int		EQ			= 0;
-	final int		LE			= 1;
-	final int		GE			= 2;
-	final int		APPROX		= 3;
-	final int		LESS		= 4;
-	final int		GREATER		= 5;
-	final int		SUBSET		= 6;
-	final int		SUPERSET	= 7;
-
-	private String	filter;
-
-	abstract class Query {
-		static final String	GARBAGE		= "Trailing garbage";
-		static final String	MALFORMED	= "Malformed query";
-		static final String	EMPTY		= "Empty list";
-		static final String	SUBEXPR		= "No subexpression";
-		static final String	OPERATOR	= "Undefined operator";
-		static final String	TRUNCATED	= "Truncated expression";
-		static final String	EQUALITY	= "Only equality supported";
-
-		private String		tail;
-
-		boolean match() throws IllegalArgumentException {
-			tail = filter;
-			boolean val = doQuery();
-			if (tail.length() > 0)
-				error(GARBAGE);
-			return val;
-		}
-
-		private boolean doQuery() throws IllegalArgumentException {
-			if (tail.length() < 3 || !prefix("("))
-				error(MALFORMED);
-			boolean val;
-
-			switch (tail.charAt(0)) {
-				case '&' :
-					val = doAnd();
-					break;
-				case '|' :
-					val = doOr();
-					break;
-				case '!' :
-					val = doNot();
-					break;
-				default :
-					val = doSimple();
-					break;
-			}
-
-			if (!prefix(")"))
-				error(MALFORMED);
-			return val;
-		}
-
-		private boolean doAnd() throws IllegalArgumentException {
-			tail = tail.substring(1);
-			boolean val = true;
-			if (!tail.startsWith("("))
-				error(EMPTY);
-			do {
-				if (!doQuery())
-					val = false;
-			} while (tail.startsWith("("));
-			return val;
-		}
-
-		private boolean doOr() throws IllegalArgumentException {
-			tail = tail.substring(1);
-			boolean val = false;
-			if (!tail.startsWith("("))
-				error(EMPTY);
-			do {
-				if (doQuery())
-					val = true;
-			} while (tail.startsWith("("));
-			return val;
-		}
-
-		private boolean doNot() throws IllegalArgumentException {
-			tail = tail.substring(1);
-			if (!tail.startsWith("("))
-				error(SUBEXPR);
-			return !doQuery();
-		}
-
-		private boolean doSimple() throws IllegalArgumentException {
-			int op = 0;
-			Object attr = getAttr();
-
-			if (prefix("="))
-				op = EQ;
-			else if (prefix("<="))
-				op = LE;
-			else if (prefix(">="))
-				op = GE;
-			else if (prefix("~="))
-				op = APPROX;
-			else if (prefix("*>"))
-				op = SUPERSET;
-			else if (prefix("<*"))
-				op = SUBSET;
-			else if (prefix("<"))
-				op = LESS;
-			else if (prefix(">"))
-				op = GREATER;
-			else
-				error(OPERATOR);
-
-			return compare(attr, op, getValue());
-		}
-
-		private boolean prefix(String pre) {
-			if (!tail.startsWith(pre))
-				return false;
-			tail = tail.substring(pre.length());
-			return true;
-		}
-
-		private Object getAttr() {
-			int len = tail.length();
-			int ix = 0;
-			label: for (; ix < len; ix++) {
-				switch (tail.charAt(ix)) {
-					case '(' :
-					case ')' :
-					case '<' :
-					case '>' :
-					case '=' :
-					case '~' :
-					case '*' :
-					case '}' :
-					case '{' :
-					case '\\' :
-						break label;
-				}
-			}
-			String attr = tail.substring(0, ix).toLowerCase();
-			tail = tail.substring(ix);
-			return getProp(attr);
-		}
-
-		abstract Object getProp(String key);
-
-		private String getValue() {
-			StringBuffer sb = new StringBuffer();
-			int len = tail.length();
-			int ix = 0;
-			label: for (; ix < len; ix++) {
-				char c = tail.charAt(ix);
-				switch (c) {
-					case '(' :
-					case ')' :
-						break label;
-					case '*' :
-						sb.append(WILDCARD);
-						break;
-					case '\\' :
-						if (ix == len - 1)
-							break label;
-						sb.append(tail.charAt(++ix));
-						break;
-					default :
-						sb.append(c);
-						break;
-				}
-			}
-			tail = tail.substring(ix);
-			return sb.toString();
-		}
-
-		private void error(String m) throws IllegalArgumentException {
-			throw new IllegalArgumentException(m + " " + tail);
-		}
-
-		private boolean compare(Object obj, int op, String s) {
-			if (obj == null) {
-				// No value is ok for a subset
-				if (op == SUBSET)
-					return true;
-
-				// No value is ok for a superset when the value is
-				// empty
-				if (op == SUPERSET) {
-					return s.trim().length() == 0;
-				}
-
-				return false;
-			}
-			try {
-				Class numClass = obj.getClass();
-				if (numClass == String.class) {
-					return compareString((String) obj, op, s);
-				}
-				else if (numClass == Character.class) {
-					return compareString(obj.toString(), op, s);
-				}
-				else if (numClass == Long.class) {
-					return compareSign(op, Long.valueOf(s)
-							.compareTo((Long) obj));
-				}
-				else if (numClass == Integer.class) {
-					return compareSign(op, Integer.valueOf(s).compareTo(
-							(Integer) obj));
-				}
-				else if (numClass == Short.class) {
-					return compareSign(op, Short.valueOf(s).compareTo(
-							(Short) obj));
-				}
-				else if (numClass == Byte.class) {
-					return compareSign(op, Byte.valueOf(s)
-							.compareTo((Byte) obj));
-				}
-				else if (numClass == Double.class) {
-					return compareSign(op, Double.valueOf(s).compareTo(
-							(Double) obj));
-				}
-				else if (numClass == Float.class) {
-					return compareSign(op, Float.valueOf(s).compareTo(
-							(Float) obj));
-				}
-				else if (numClass == Boolean.class) {
-					if (op != EQ)
-						return false;
-					int a = Boolean.valueOf(s).booleanValue() ? 1 : 0;
-					int b = ((Boolean) obj).booleanValue() ? 1 : 0;
-					return compareSign(op, a - b);
-				}
-				else if (numClass == BigInteger.class) {
-					return compareSign(op, new BigInteger(s)
-							.compareTo((BigInteger) obj));
-				}
-				else if (obj instanceof Collection) {
-					if (op == SUBSET || op == SUPERSET) {
-						StringSet set = new StringSet(s);
-						if (op == SUBSET)
-							return set.containsAll((Collection) obj);
-						else
-							return ((Collection) obj).containsAll(set);
-					}
-
-					for (Iterator i = ((Collection) obj).iterator(); i
-							.hasNext();) {
-						Object element = i.next();
-						if (compare(element, op, s))
-							return true;
-					}
-				}
-				else if (numClass.isArray()) {
-					int len = Array.getLength(obj);
-					for (int i = 0; i < len; i++)
-						if (compare(Array.get(obj, i), op, s))
-							return true;
-				}
-				else {
-					try {
-						if (op == SUPERSET || op == SUBSET) {
-							StringSet set = new StringSet(s);
-							if (op == SUPERSET)
-								return set.contains(obj);
-							else
-								return set.size() == 0
-										|| (set.size() == 1 && set.iterator()
-												.next().equals(obj));
-						}
-						else {
-							Constructor constructor = numClass
-									.getConstructor(new Class[] {String.class});
-							Object instance = constructor
-									.newInstance(new Object[] {s});
-							switch (op) {
-								case EQ :
-									return obj.equals(instance);
-								case LESS :
-									return ((Comparable) obj)
-											.compareTo(instance) < 0;
-								case GREATER :
-									return ((Comparable) obj)
-											.compareTo(instance) > 0;
-								case LE :
-									return ((Comparable) obj)
-											.compareTo(instance) <= 0;
-								case GE :
-									return ((Comparable) obj)
-											.compareTo(instance) >= 0;
-							}
-						}
-					}
-					catch (Exception e) {
-						e.printStackTrace();
-						// Ignore
-					}
-				}
-			}
-			catch (Exception e) {
-			}
-			return false;
-		}
-	}
-
-	class DictQuery extends Query {
-		private Map	dict;
-
-		DictQuery(Map dict) {
-			this.dict = dict;
-		}
-
-		Object getProp(String key) {
-			return dict.get(key);
-		}
-	}
-
-	public FilterImpl(String filter) throws IllegalArgumentException {
-		// NYI: Normalize the filter string?
-		this.filter = filter;
-		if (filter == null || filter.length() == 0)
-			throw new IllegalArgumentException("Null query");
-	}
-
-	public boolean match(Map dict) {
-		try {
-			return new DictQuery(dict).match();
-		}
-		catch (IllegalArgumentException e) {
-			return false;
-		}
-	}
-
-	public String toString() {
-		return filter;
-	}
-
-	public boolean equals(Object obj) {
-		return obj != null && obj instanceof FilterImpl
-				&& filter.equals(((FilterImpl) obj).filter);
-	}
-
-	public int hashCode() {
-		return filter.hashCode();
-	}
-
-	boolean compareString(String s1, int op, String s2) {
-		switch (op) {
-			case EQ :
-				return patSubstr(s1, s2);
-			case APPROX :
-				return patSubstr(fixupString(s1), fixupString(s2));
-			default :
-				return compareSign(op, s2.compareTo(s1));
-		}
-	}
-
-	boolean compareSign(int op, int cmp) {
-		switch (op) {
-			case LE :
-				return cmp >= 0;
-			case GE :
-				return cmp <= 0;
-			case EQ :
-				return cmp == 0;
-			default : /* APPROX */
-				return cmp == 0;
-		}
-	}
-
-	String fixupString(String s) {
-		StringBuffer sb = new StringBuffer();
-		int len = s.length();
-		boolean isStart = true;
-		boolean isWhite = false;
-		for (int i = 0; i < len; i++) {
-			char c = s.charAt(i);
-			if (Character.isWhitespace(c)) {
-				isWhite = true;
-			}
-			else {
-				if (!isStart && isWhite)
-					sb.append(' ');
-				if (Character.isUpperCase(c))
-					c = Character.toLowerCase(c);
-				sb.append(c);
-				isStart = false;
-				isWhite = false;
-			}
-		}
-		return sb.toString();
-	}
-
-	boolean patSubstr(String s, String pat) {
-		if (s == null)
-			return false;
-		if (pat.length() == 0)
-			return s.length() == 0;
-		if (pat.charAt(0) == WILDCARD) {
-			pat = pat.substring(1);
-			for (;;) {
-				if (patSubstr(s, pat))
-					return true;
-				if (s.length() == 0)
-					return false;
-				s = s.substring(1);
-			}
-		}
-		else {
-			if (s.length() == 0 || s.charAt(0) != pat.charAt(0))
-				return false;
-			return patSubstr(s.substring(1), pat.substring(1));
-		}
-	}
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/Manifest.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/Manifest.java
deleted file mode 100644
index 01c3f51..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/Manifest.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * $Id: Manifest.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import java.io.*;
-import java.util.*;
-
-
-public class Manifest extends Hashtable {
-	static final long	serialVersionUID	= 1L;
-	List				imports;
-	List				exports;
-	ManifestEntry		name;
-	String				activator;
-	String				classpath[]	= new String[] {"."};
-	int					section;
-	String				location;
-	Native				_native[];
-	Vector				duplicates	= new Vector();
-	final static String	wordparts	= "~!@#$%^&*_:/?><.-+";
-	ManifestEntry		bsn;
-	VersionRange			version;
-	ManifestEntry		host;
-	List				require;
-
-	public Manifest(InputStream in) throws IOException {
-		parse(new InputStreamReader(in, "UTF8"));
-	}
-
-	public Manifest(Reader in) throws IOException {
-		parse(in);
-	}
-
-	public Object put(Object header, Object value) {
-		if (containsKey(header)) {
-			if (!((String) header).equalsIgnoreCase("comment"))
-				duplicates.add(header + ":" + value);
-		}
-		return super.put(header, value);
-	}
-
-	void parse(Reader in) throws IOException {
-		BufferedReader rdr = new BufferedReader(in);
-		String current = " ";
-		String buffer = rdr.readLine();
-		int section = 0;
-		if (buffer != null && !buffer.startsWith("Manifest-Version")) {
-			System.err
-					.println("The first line of a manifest file must be the Manifest-Version attribute");
-			throw new IOException(
-					"The first line of a manifest file must be the Manifest-Version attribute");
-		}
-		while (buffer != null && current != null && section == 0) {
-			if (current.startsWith(" ")) {
-				buffer += current.substring(1);
-			}
-			else {
-				section += entry(buffer);
-				buffer = current;
-			}
-			current = rdr.readLine();
-		}
-		entry(buffer);
-	}
-
-	int entry(String line) throws IOException {
-		if (line.length() < 2)
-			return 1;
-		int colon = line.indexOf(':');
-		if (colon < 1) {
-			error("Invalid header '" + line + "'");
-		}
-		else {
-			String header = line.substring(0, colon).toLowerCase();
-			String alphanum = "abcdefghijklmnopqrstuvwxyz0123456789";
-			String set = alphanum;
-			if (alphanum.indexOf(header.charAt(0)) < 0)
-				error("Header does not start with alphanum: " + header);
-			for (int i = 0; i < header.length(); i++) {
-				if (set.indexOf(header.charAt(i)) < 0)
-					error("Header contains non alphanum, - _: " + header);
-				set = "_-" + alphanum;
-			}
-			String value = "";
-			if (colon + 2 < line.length())
-				value = line.substring(colon + 2);
-			else
-				error("No value for manifest header " + header);
-			if (section == 0) {
-				if (header.equals("bundle-symbolicname")) {
-					bsn = (ManifestEntry) getEntries(value).get(0);
-				}
-				if (header.equals("bundle-version")) {
-					try {
-						version = new VersionRange(value.trim());
-					}
-					catch (Exception e) {
-						version = new VersionRange("0");
-						System.err.println("Invalid version attr for: " + bsn
-								+ " value is " + value);
-					}
-				}
-				if (header.equals("fragment-host"))
-					host = (ManifestEntry) getEntries(value).get(0);
-				if (header.equals("require-bundle"))
-					require = getEntries(value);
-				if (header.equals("import-package"))
-					imports = getEntries(value);
-				else if (header.equals("export-package"))
-					exports = getEntries(value);
-				else if (header.equals("bundle-activator"))
-					activator = value.trim();
-				else if (header.equals("bundle-updatelocation"))
-					location = value.trim();
-				else if (header.equals("bundle-classpath"))
-					classpath = getClasspath(value);
-				else if (header.equals("bundle-nativecode"))
-					_native = getNative(value);
-				put(header, value);
-			}
-		}
-		return 0;
-	}
-
-	void error(String msg) throws IOException {
-		System.err.println("Reading manifest: " + msg);
-	}
-
-	void warning(String msg) throws IOException {
-		System.err.println("Reading manifest: " + msg);
-	}
-
-	StreamTokenizer getStreamTokenizer(String line) {
-		StreamTokenizer st = new StreamTokenizer(new StringReader(line));
-		st.resetSyntax();
-		st.wordChars('a', 'z');
-		st.wordChars('A', 'Z');
-		st.wordChars('0', '9');
-		st.whitespaceChars(0, ' ');
-		st.quoteChar('"');
-		for (int i = 0; i < wordparts.length(); i++)
-			st.wordChars(wordparts.charAt(i), wordparts.charAt(i));
-		return st;
-	}
-
-	String word(StreamTokenizer st) throws IOException {
-		switch (st.nextToken()) {
-			case '"' :
-			case StreamTokenizer.TT_WORD :
-				String result = st.sval;
-				st.nextToken();
-				return result;
-		}
-		return null;
-	}
-
-	Parameter getParameter(StreamTokenizer st) throws IOException {
-
-		Parameter parameter = new Parameter();
-		parameter.key = word(st);
-		if (st.ttype == ':') {
-			st.nextToken();
-			parameter.type = Parameter.DIRECTIVE;
-		}
-		else {
-			parameter.type = Parameter.ATTRIBUTE;
-		}
-
-		if (st.ttype == '=') {
-			parameter.value = word(st);
-			while (st.ttype == StreamTokenizer.TT_WORD || st.ttype == '"') {
-				parameter.value += " " + st.sval;
-				st.nextToken();
-			}
-		}
-
-		return parameter;
-	}
-
-	public List getEntries(String line) throws IOException {
-		List v = new Vector();
-		Set aliases = new HashSet();
-
-		StreamTokenizer st = getStreamTokenizer(line);
-		do {
-			Parameter parameter = getParameter(st);
-			ManifestEntry p = new ManifestEntry(parameter.key);
-			while (st.ttype == ';') {
-				parameter = getParameter(st);
-				if (parameter.value == null) {
-					aliases.add(parameter.key);
-				}
-				else {
-					if (parameter.type == Parameter.ATTRIBUTE)
-						p.addParameter(parameter);
-					else
-						p.addParameter(parameter);
-				}
-			}
-			v.add(p);
-			for (Iterator a = aliases.iterator(); a.hasNext();) {
-				v.add(p.getAlias((String) a.next()));
-			}
-		} while (st.ttype == ',');
-		return v;
-	}
-
-	Native[] getNative(String line) throws IOException {
-		Vector v = new Vector();
-		StreamTokenizer st = getStreamTokenizer(line);
-		do {
-			Native spec = new Native();
-			Vector names = new Vector();
-			do {
-				Parameter parameter = getParameter(st);
-				if (parameter.value == null)
-					names.add(parameter.key);
-				else if (parameter.is("processor", Parameter.ATTRIBUTE))
-					spec.processor = parameter.value;
-				else if (parameter.is("osname", Parameter.ATTRIBUTE))
-					spec.osname = parameter.value;
-				else if (parameter.is("osversion", Parameter.ATTRIBUTE))
-					spec.osversion = parameter.value;
-				else if (parameter.is("language", Parameter.ATTRIBUTE))
-					spec.language = parameter.value;
-				else if (parameter.is("selection-filter", Parameter.DIRECTIVE))
-					spec.filter = parameter.value;
-				else
-					warning("Unknown parameter for native code : " + parameter);
-			} while (st.ttype == ';');
-			spec.paths = new String[names.size()];
-			names.copyInto(spec.paths);
-			v.add(spec);
-		} while (st.ttype == ',');
-		Native[] result = new Native[v.size()];
-		v.copyInto(result);
-		return result;
-	}
-
-	String[] getClasspath(String line) throws IOException {
-		StringTokenizer st = new StringTokenizer(line, " \t,");
-		String result[] = new String[st.countTokens()];
-		for (int i = 0; i < result.length; i++)
-			result[i] = st.nextToken();
-		return result;
-	}
-
-	public List getImports() {
-		return imports;
-	}
-
-	public List getExports() {
-		return exports;
-	}
-
-	public String getActivator() {
-		return activator;
-	}
-
-	public String getLocation() {
-		return location;
-	}
-
-	public String[] getClasspath() {
-		return classpath;
-	}
-
-	public Native[] getNative() {
-		return _native;
-	}
-
-	public Object get(Object key) {
-		if (key instanceof String)
-			return super.get(((String) key).toLowerCase());
-		else
-			return null;
-	}
-
-	public String getValue(String key) {
-		return (String) super.get(key.toLowerCase());
-	}
-
-	public String getValue(String key, String deflt) {
-		String s = getValue(key);
-		if (s == null)
-			return deflt;
-		else
-			return s;
-	}
-
-	public String[] getRequiredExecutionEnvironments() {
-		String ees = getValue("Bundle-RequiredExecutionEnvironment");
-		if (ees != null)
-			return ees.trim().split("\\s*,\\s*");
-		else
-			return null;
-	}
-
-	public VersionRange getVersion() {
-		if (version == null)
-			return new VersionRange("0");
-		return version;
-	}
-
-	public String getSymbolicName() {
-		ManifestEntry bsn = getBsn();
-
-		if (bsn == null) {
-			String name = getValue("Bundle-Name");
-			if (name == null)
-				name = "Untitled-" + hashCode();
-			return name;
-		}
-		else
-			return bsn.getName();
-	}
-
-	public String getManifestVersion() {
-		return getValue("Bundle-ManifestVersion", "1");
-	}
-
-	public String getCopyright() {
-		return getValue("Bundle-Copyright");
-	}
-
-	public String getDocumentation() {
-		return getValue("Bundle-DocURL");
-	}
-
-	public String[] getCategories() {
-		String cats = getValue("Bundle-Category");
-		if (cats == null)
-			return new String[0];
-		else
-			return cats.split("\\s*,\\s*");
-	}
-
-	public Native[] get_native() {
-		return _native;
-	}
-
-	public void set_native(Native[] _native) {
-		this._native = _native;
-	}
-
-	public ManifestEntry getBsn() {
-		return bsn;
-	}
-
-	public void setBsn(ManifestEntry bsn) {
-		this.bsn = bsn;
-	}
-
-	public Vector getDuplicates() {
-		return duplicates;
-	}
-
-	public void setDuplicates(Vector duplicates) {
-		this.duplicates = duplicates;
-	}
-
-	public ManifestEntry getHost() {
-		return host;
-	}
-
-	public void setHost(ManifestEntry host) {
-		this.host = host;
-	}
-
-	public List getRequire() {
-		return require;
-	}
-
-}
-
-class Native {
-	String	filter;
-	int		index	= -1;
-	String	paths[];
-	String	osname;
-	String	osversion;
-	String	language;
-	String	processor;
-
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/ManifestEntry.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/ManifestEntry.java
deleted file mode 100644
index 2dc3e69..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/ManifestEntry.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * $Id: ManifestEntry.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import java.util.*;
-
-
-public class ManifestEntry implements Comparable {
-	String		name;
-	VersionRange	version;
-	Map			attributes;
-	public Map	directives;
-	public Set	uses;
-
-	public ManifestEntry(String name) {
-		this.name = name;
-	}
-
-	public ManifestEntry(String name, VersionRange version) {
-		this.name = name;
-		this.version = version;
-	}
-
-	public String toString() {
-		if (version == null)
-			return name;
-		return name + " ;version=" + version;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public VersionRange getVersion() {
-		if (version != null)
-			return version;
-		return new VersionRange("0");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public int compareTo(Object o) {
-		ManifestEntry p = (ManifestEntry) o;
-		return name.compareTo(p.name);
-	}
-
-	/**
-	 * @return
-	 */
-	public Object getPath() {
-		return getName().replace('.', '/');
-	}
-
-	public Map getDirectives() {
-		return directives;
-	}
-
-	public Map getAttributes() {
-		return attributes;
-	}
-
-	/**
-	 * @param parameter
-	 */
-	public void addParameter(Parameter parameter) {
-		switch (parameter.type) {
-			case Parameter.ATTRIBUTE :
-				if (attributes == null)
-					attributes = new HashMap();
-				attributes.put(parameter.key, parameter.value);
-				if (parameter.key.equalsIgnoreCase("version")
-						|| parameter.key
-								.equalsIgnoreCase("specification-version"))
-					this.version = new VersionRange(parameter.value);
-				break;
-
-			case Parameter.DIRECTIVE :
-				if (directives == null)
-					directives = new HashMap();
-				directives.put(parameter.key, parameter.value);
-				break;
-		}
-	}
-
-	public ManifestEntry getAlias(String key) {
-		ManifestEntry me = new ManifestEntry(key);
-		me.attributes = attributes;
-		me.directives = directives;
-		me.version = version;
-		return me;
-	}
-
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/Parameter.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/Parameter.java
deleted file mode 100644
index 5038132..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/Parameter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * $Id: Parameter.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-class Parameter {
-	final static int	ATTRIBUTE	= 1;
-	final static int	DIRECTIVE	= 2;
-	final static int	SINGLE		= 0;
-
-	int					type;
-	String				key;
-	String				value;
-
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append(key);
-		switch (type) {
-			case ATTRIBUTE :
-				sb.append("=");
-				break;
-			case DIRECTIVE :
-				sb.append(":=");
-				break;
-			case SINGLE :
-				return sb.toString();
-		}
-		sb.append(value);
-		return sb.toString();
-	}
-
-	boolean is(String s, int type) {
-		return this.type == type && key.equalsIgnoreCase(s);
-	}
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/RepositoryImpl.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/RepositoryImpl.java
deleted file mode 100644
index bc6953b..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/RepositoryImpl.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * $Id: RepositoryImpl.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import java.util.zip.*;
-
-import org.kxml2.io.KXmlParser;
-import org.osgi.service.obr.*;
-import org.xmlpull.v1.*;
-
-/**
- * Implements the basic repository. A repository holds a set of resources.
- * 
- * 
- * @version $Revision: 44 $
- */
-public class RepositoryImpl implements Repository {
-	transient Set			resources		= new HashSet();
-	URL						url;
-	String					date;
-	Set						visited			= new HashSet();
-	final static Resource[]	EMPTY_RESOURCE	= new Resource[0];
-	String					name			= "Untitled";
-	long					lastModified;
-	Exception				exception;
-	int						ranking=0;
-
-	/**
-	 * Each repository is identified by a single URL.
-	 * 
-	 * A repository can hold referrals to other repositories. These referred
-	 * repositories are included at the point of referall.
-	 * 
-	 * @param url
-	 */
-	public RepositoryImpl(URL url) {
-		this.url = url;
-	}
-
-	/**
-	 * Refresh the repository from the URL.
-	 * 
-	 * @throws Exception
-	 */
-	public boolean refresh() {
-		exception = null;
-		try {
-			resources.clear();
-			parseDocument(url);
-			visited = null;
-			return true;
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			exception = e;
-		}
-		return false;
-	}
-
-	/**
-	 * Parse the repository.
-	 * 
-	 * @param parser
-	 * @throws Exception
-	 */
-	private void parseRepository(XmlPullParser parser) throws Exception {
-		try {
-			parser.require(XmlPullParser.START_DOCUMENT, null, null);
-			parser.nextTag();
-			if (parser.getName().equals("bundles"))
-				parseOscar(parser);
-			else {
-				parser.require(XmlPullParser.START_TAG, null, "repository");
-				date = parser.getAttributeValue(null, "lastmodified");
-				name = parser.getAttributeValue(null, "name");
-				if (name == null)
-					name = "Untitled";
-
-				while (parser.nextTag() == XmlPullParser.START_TAG) {
-					if (parser.getName().equals("resource")) {
-						ResourceImpl resource = new ResourceImpl(this, parser);
-						resources.add(resource);
-					}
-					else if (parser.getName().equals("referral"))
-						referral(parser);
-					else
-						throw new IllegalArgumentException(
-								"Invalid tag in repository: " + url + " "
-										+ parser.getName());
-				}
-				parser.require(XmlPullParser.END_TAG, null, "repository");
-			}
-		}
-		catch (XmlPullParserException e) {
-			e.printStackTrace();
-			throw new IllegalArgumentException("XML unregognized around: "
-					+ e.getLineNumber() + " " + e.getMessage());
-		}
-	}
-
-	/**
-	 * Parse an old style OBR repository.
-	 * 
-	 * <dtd-version>1.0</dtd-version> <repository> <name>Oscar Bundle
-	 * Repository</name> <url>http://oscar-osgi.sourceforge.net/</url>
-	 * <date>Fri May 07 16:45:07 CEST 2004</date> <extern-repositories> <!--
-	 * Stefano Lenzi (kismet@interfree.it) -->
-	 * <url>http://domoware.isti.cnr.it/osgi-obr/niche-osgi-obr.xml</url>
-	 * <!--Manuel Palencia (santillan@dit.upm.es) --> <!--
-	 * <url>http://jmood.forge.os4os.org/repository.xml</url> --> <!-- Enrique
-	 * Rodriguez (erodriguez@apache.org) -->
-	 * <url>http://update.cainenable.org/repository.xml</url>
-	 * </extern-repositories> </repository> <bundle> <bundle-name>Bundle
-	 * Repository</bundle-name> <bundle-description> A bundle repository
-	 * service for Oscar. </bundle-description> <bundle-updatelocation>
-	 * http://oscar-osgi.sf.net/repo/bundlerepository/bundlerepository.jar
-	 * </bundle-updatelocation> <bundle-sourceurl>
-	 * http://oscar-osgi.sf.net/repo/bundlerepository/bundlerepository-src.jar
-	 * </bundle-sourceurl> <bundle-version>1.1.3</bundle-version>
-	 * <bundle-docurl> http://oscar-osgi.sf.net/repo/bundlerepository/
-	 * </bundle-docurl> <bundle-category>General</bundle-category>
-	 * <import-package package="org.osgi.framework"/> <export-package
-	 * package="org.ungoverned.osgi.service.bundlerepository"
-	 * specification-version="1.1.0"/> </bundle> *
-	 */
-	private void parseOscar(XmlPullParser parser) throws Exception {
-		parser.require(XmlPullParser.START_TAG, null, "bundles");
-		while (true) {
-			int event = parser.next();
-
-			// Error ..
-			if (event == XmlPullParser.TEXT)
-				event = parser.next();
-
-			if (event != XmlPullParser.START_TAG)
-				break;
-
-			ResourceImpl resource = new ResourceImpl(this);
-
-			if (parser.getName().equals("bundle")) {
-				while (parser.nextTag() == XmlPullParser.START_TAG) {
-					String key = parser.getName();
-					if (key.equals("import-package")) {
-						RequirementImpl requirement = new RequirementImpl(
-								"package");
-						
-						requirement.setOptional(false);
-						requirement.setMultiple(false);
-						
-						String p = parser.getAttributeValue(null, "package");
-						StringBuffer sb = new StringBuffer();
-						sb.append("(&(package=");
-						sb.append(p);
-						sb.append(")");
-						String version = parser.getAttributeValue(null,
-								"specification-version");
-						VersionRange v = new VersionRange("0");
-						if (version != null) {
-							sb.append("(version=");
-							sb.append(v= new VersionRange(version));
-							sb.append(")");
-						}
-						sb.append(")");
-						requirement.setFilter(sb.toString());
-						requirement.setComment("Import-Package: " + p + ";" + v );
-						resource.addRequirement(requirement);
-						
-						parser.nextTag();
-					}
-					else if (key.equals("export-package")) {
-						CapabilityImpl capability = new CapabilityImpl(
-								"package");
-						capability.addProperty("package", parser
-								.getAttributeValue(null, "package"));
-						String version = parser.getAttributeValue(null,
-								"specification-version");
-						if (version != null) {
-							capability.addProperty("version", new VersionRange(
-									version));
-						}
-						resource.addCapability(capability);
-						parser.nextTag();
-					}
-					else {
-						String value = parser.nextText().trim();
-						if (key.equals("bundle-sourceurl"))
-							resource.setSource(new URL(value));
-						else if (key.equals("bundle-docurl"))
-							resource.setDocumentation(new URL(value));
-						else if (key.equals("bundle-updatelocation"))
-							resource.setURL(new URL(value));
-						else if (key.equals("bundle-description"))
-							resource.setDescription(value);
-						else if (key.equals("bundle-category"))
-							resource.addCategory(value);
-						else if (key.equals("bundle-name")) {
-							resource.setName(value);
-							resource.setPresentationName(value);
-						}
-						else if (key.equals("bundle-version"))
-							resource.setVersion(new VersionRange(value));
-						else {
-							resource.put(key, value);
-						}
-					}
-				}
-				resources.add(resource);
-				parser.require(XmlPullParser.END_TAG, null, "bundle");
-			}
-			else if (parser.getName().equals("repository")) {
-				parser.require(XmlPullParser.START_TAG, null, "repository");
-				while (parser.nextTag() == XmlPullParser.START_TAG) {
-					String tag = parser.getName();
-					if (tag.equals("name")) {
-						String name = parser.nextText();
-						if (this.name == null)
-							this.name = name.trim();
-					}
-					else if (tag.equals("url"))
-						parser.nextText().trim();
-					else if (tag.equals("date"))
-						parser.nextText().trim();
-					else if (tag.equals("extern-repositories")) {
-						parser.require(XmlPullParser.START_TAG, null,
-								"extern-repositories");
-						while (parser.nextTag() == XmlPullParser.START_TAG) {
-							if (parser.getName().equals("url"))
-								parseDocument(new URL(parser.nextText().trim()));
-							else
-								throw new IllegalArgumentException(
-										"Invalid tag in repository while parsing extern repositories: "
-												+ url + " " + parser.getName());
-						}
-						parser.require(XmlPullParser.END_TAG, null,
-								"extern-repositories");
-					}
-					else
-						throw new IllegalArgumentException(
-								"Invalid tag in repository: " + url + " "
-										+ parser.getName());
-				}
-				parser.require(XmlPullParser.END_TAG, null, "repository");
-			}
-			else if (parser.getName().equals("dtd-version")) {
-				parser.nextText();
-			}
-			else
-				throw new IllegalArgumentException(
-						"Invalid tag in repository: " + url + " "
-								+ parser.getName());
-		}
-		parser.require(XmlPullParser.END_TAG, null, "bundles");
-	}
-
-	/**
-	 * We have a referral to another repository. Just create another parser and
-	 * read it inline.
-	 * 
-	 * @param parser
-	 */
-	void referral(XmlPullParser parser) {
-		// TODO handle depth!
-		try {
-			parser.require(XmlPullParser.START_TAG, null, "referral");
-			// String depth = parser.getAttributeValue(null, "depth");
-			String path = parser.getAttributeValue(null, "url");
-			URL url = new URL(this.url, path);
-			parseDocument(url);
-			parser.next();
-			parser.require(XmlPullParser.END_TAG, null, "referral");
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * Parse a repository document.
-	 * 
-	 * @param url
-	 * @throws IOException
-	 * @throws XmlPullParserException
-	 * @throws Exception
-	 */
-	void parseDocument(URL url) throws IOException, XmlPullParserException,
-			Exception {
-		if (!visited.contains(url)) {
-			visited.add(url);
-			try {
-				System.out.println("Visiting: " + url);
-				InputStream in = null;
-				
-				if ( url.getPath().endsWith(".zip")) {
-					ZipInputStream zin = new ZipInputStream( url.openStream() );
-					ZipEntry entry = zin.getNextEntry();
-					while ( entry != null ) {
-						if ( entry.getName().equals("repository.xml")) {
-							in = zin;
-							break;
-						}
-						entry = zin.getNextEntry();
-					}
-				} else {
-					in = url.openStream();
-				}
-				Reader reader = new InputStreamReader(in);
-				XmlPullParser parser = new KXmlParser();
-				parser.setInput(reader);
-				parseRepository(parser);
-			} catch( MalformedURLException e ) {
-				System.out.println("Cannot create connection to url");
-			}
-		}
-	}
-
-	public URL getURL() {
-		return url;
-	}
-
-	/**
-	 * @return
-	 */
-	public Collection getResourceList() {
-		return resources;
-	}
-
-	public Resource[] getResources() {
-		return (Resource[]) getResourceList().toArray(EMPTY_RESOURCE);
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public Resource getResource(String id) {
-		for (Iterator i = getResourceList().iterator(); i.hasNext();) {
-			ResourceImpl resource = (ResourceImpl) i.next();
-			if (resource.getId().equals(id))
-				return resource;
-		}
-		return null;
-	}
-
-	public long getLastModified() {
-		return lastModified;
-	}
-
-	public int getRanking() {
-		return ranking;
-	}
-
-	public void setRanking(int ranking) {
-		this.ranking = ranking;
-	}
-
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/RequirementImpl.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/RequirementImpl.java
deleted file mode 100644
index 146618a..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/RequirementImpl.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * $Id: RequirementImpl.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import org.osgi.service.obr.*;
-import org.xmlpull.v1.XmlPullParser;
-
-
-
-/**
- * Implements the Requirement interface.
- * 
- * 
- * @version $Revision: 44 $
- */
-public class RequirementImpl implements Requirement {
-	int		id;
-	String	name;
-	String	filter="()";
-	FilterImpl	_filter;
-	String	comment;
-	boolean optional;
-	boolean multiple;
-	boolean extend;
-	
-	/**
-	 * Create a requirement with the given name.
-	 * 
-	 * @param name
-	 */
-	public RequirementImpl(String name) {
-		this.name = name;
-	}
-
-
-	/**
-	 * Parse the requirement from the pull parser.
-	 * 
-	 * @param parser
-	 * @throws Exception
-	 */
-	public RequirementImpl(XmlPullParser parser) throws Exception {
-		parser.require(XmlPullParser.START_TAG, null, null );
-		name = parser.getAttributeValue(null, "name");
-		filter = parser.getAttributeValue(null, "filter");
-		
-		String opt = parser.getAttributeValue(null,"optional");
-		String mul = parser.getAttributeValue(null,"multiple");
-		String ext = parser.getAttributeValue(null,"extend");
-		optional = "true".equalsIgnoreCase(opt);
-		multiple = "true".equalsIgnoreCase(mul);
-		extend = "true".equalsIgnoreCase(ext);
-		
-		
-		StringBuffer sb = new StringBuffer();
-		while ( parser.next() == XmlPullParser.TEXT ) {
-			sb.append( parser.getText() );
-		}
-		if ( sb.length() > 0 )
-			setComment(sb.toString().trim());
-			
-		parser.require(XmlPullParser.END_TAG, null, null );
-	}
-
-	public void setFilter(String filter) {
-		this.filter = filter;
-		_filter= null;
-	}
-
-	public String getFilter() {
-		return filter;
-	}
-
-	public Tag toXML(String name) {
-		Tag tag = toXML(this);
-		tag.rename(name);
-		return tag;
-	}
-
-
-	public String getName() {
-		return name;
-	}
-
-	public boolean isSatisfied(Capability capability) {
-		if (_filter == null)
-			_filter = new FilterImpl(filter);
-
-		boolean result = _filter.match(capability.getProperties());
-		return result;
-	}
-
-	public String toString() {
-		return name + " " + filter;
-	}
-
-
-	public String getComment() {
-		return comment;
-	}
-
-
-	public void setComment(String comment) {
-		this.comment=comment;
-	}
-
-
-	public static Tag toXML(Requirement requirement) {
-		Tag req = new Tag("require");
-		req.addAttribute("name", requirement.getName());
-		req.addAttribute("filter", requirement.getFilter());
-		
-		req.addAttribute("optional", requirement.isOptional()+"");
-		req.addAttribute("multiple", requirement.isMultiple()+"");
-		req.addAttribute("extend", requirement.isExtend()+"");
-		
-		if ( requirement.getComment() != null )
-			req.addContent(requirement.getComment());
-		
-		return req;
-	}
-
-
-	public boolean isMultiple() {
-		return multiple;
-	}
-
-
-	public boolean isOptional() {
-		return optional;
-	}
-
-
-	public void setOptional(boolean b) {
-		optional = b;
-	}
-
-	public void setMultiple(boolean b) {
-		multiple = b;
-	}
-
-
-	public boolean equals(Object o) {
-		if ( ! (o instanceof Requirement) )
-			return false;
-		
-		Requirement r2 = (Requirement)o;
-		return filter.equals(r2.getFilter()) && name.equals(r2.getName()); 
-	}
-	
-	public int hashCode() {
-		return filter.hashCode() ^ name.hashCode();
-	}
-	
-	public boolean isExtend() {
-		return extend;
-	}
-	
-	public void setExtend(boolean extend) {
-		this.extend = extend;
-	}
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/ResourceImpl.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/ResourceImpl.java
deleted file mode 100644
index 55cd298..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/ResourceImpl.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * $Id: ResourceImpl.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import java.io.File;
-import java.net.URL;
-import java.util.*;
-
-import org.osgi.framework.Version;
-import org.osgi.service.obr.*;
-import org.xmlpull.v1.XmlPullParser;
-
-public class ResourceImpl implements Resource {
-	List			capabilities	= new ArrayList();
-	List			requirements	= new ArrayList();
-	URL				url;
-	String			symbolicName;
-	VersionRange		version;
-	List			categories		= new ArrayList();
-	long			size			= -1;
-	String			id;
-	static int		ID				= 1;
-	Map				map				= new HashMap();
-	RepositoryImpl	repository;
-	String			presentationName;
-	File			file;
-
-
-	public ResourceImpl(RepositoryImpl repository, String name,
-			VersionRange version) {
-		this.version = version;
-		if ( version == null)
-			this.version = new VersionRange("0");
-		this.symbolicName = name;
-		this.repository = repository;
-	}
-
-	public ResourceImpl(RepositoryImpl repository, XmlPullParser parser)
-			throws Exception {
-		this.repository = repository;
-		parser.require(XmlPullParser.START_TAG, null, "resource");
-		symbolicName = parser.getAttributeValue(null, "symbolicname");
-		if (symbolicName == null)
-			System.err.println("Hey, no symb name! "
-					+ parser.getAttributeValue(null, "uri"));
-
-		map.put(SYMBOLIC_NAME, symbolicName);
-		presentationName = parser.getAttributeValue(null, PRESENTATION_NAME);
-		if (presentationName != null)
-			map.put(PRESENTATION_NAME, presentationName);
-		String v = parser.getAttributeValue(null, "version");
-		if (v == null)
-			setVersion(new VersionRange("0"));
-		else
-			setVersion(new VersionRange(v));
-
-		setURL(toURL(parser.getAttributeValue(null, "uri")));
-
-		while (parser.nextTag() == XmlPullParser.START_TAG) {
-			if (parser.getName().equals("category")) {
-				categories.add(parser.getAttributeValue(null, "id").trim());
-			}
-			else if (parser.getName().equals("require"))
-				addRequirement(new RequirementImpl(parser));
-			else if (parser.getName().equals("capability"))
-				addCapability(new CapabilityImpl(parser));
-			else {
-				String text = parser.nextText();
-				if (text != null)
-					map.put(parser.getName(), text.trim());
-			}
-			parser.next();
-		}
-		parser.require(XmlPullParser.END_TAG, null, "resource");
-	}
-
-	public ResourceImpl(RepositoryImpl impl) {
-		this.repository = impl;
-	}
-
-	private URL toURL(String attributeValue) throws Exception {
-		if (attributeValue == null)
-			return null;
-
-		return new URL(repository.getURL(), attributeValue);
-	}
-
-	public void addCategory(String category) {
-		categories.add(category);
-	}
-
-	public void addCapability(CapabilityImpl capability) {
-		if (capability != null)
-			capabilities.add(capability);
-	}
-
-	public void addRequirement(RequirementImpl requirement) {
-		if (requirement != null)
-			requirements.add(requirement);
-	}
-
-	public void setLicense(URL license) {
-		if (license != null)
-			map.put(LICENSE_URL, license);
-	}
-
-	public String getDescription() {
-		return (String) map.get(DESCRIPTION);
-	}
-
-	public void setDescription(String description) {
-		if (description != null)
-			map.put(DESCRIPTION, description);
-	}
-
-	public Capability[] getCapabilities() {
-		return (Capability[]) capabilities.toArray(new Capability[capabilities
-				.size()]);
-	}
-
-	public URL getLicense() {
-		return (URL) map.get(LICENSE_URL);
-	}
-
-	public String getSymbolicName() {
-		return symbolicName;
-	}
-
-	public Requirement[] getRequirements() {
-		return (Requirement[]) requirements
-				.toArray(new Requirement[requirements.size()]);
-	}
-
-	public Tag toXML() {
-		return toXML(this );
-	}
-
-	public static Tag toXML(Resource resource) {
-		return toXML(resource,true);
-	}
-
-	public static Tag toXML(Resource resource, boolean relative ) {
-		Tag meta = new Tag("resource");
-		URL url = resource.getURL();
-		String urlString = url.toExternalForm();
-		
-		if ( relative )
-			urlString = makeRelative(resource.getRepository().getURL(), url);
-		
-		meta.addAttribute("uri", urlString );
-		meta.addAttribute(SYMBOLIC_NAME, resource.getSymbolicName());
-		if (resource.getPresentationName() != null)
-			meta
-					.addAttribute(PRESENTATION_NAME, resource
-							.getPresentationName());
-		meta.addAttribute(VERSION, resource.getVersion().toString());
-		meta.addAttribute("id", resource.getId());
-		Map map = new TreeMap(resource.getProperties());
-		for (int i = 0; i < Resource.KEYS.length; i++) {
-			String key = KEYS[i];
-			if (!(key.equals(URL) || key.equals(SYMBOLIC_NAME) || key
-					.equals(VERSION) || key.equals(PRESENTATION_NAME))) {
-				Object value = map.get(KEYS[i]);
-				if (value != null) {
-					if (value instanceof URL)
-						value = makeRelative(resource.getRepository().getURL(),(URL) value);
-					meta.addContent(new Tag(key, value.toString()));
-				}
-			}
-		}
-
-		String[] categories = resource.getCategories();
-		for (int i = 0; i < categories.length; i++) {
-			String category = categories[i];
-			meta.addContent(new Tag("category", new String[] {"id",
-					category.toLowerCase()}));
-		}
-
-		Capability[] capabilities = resource.getCapabilities();
-		for (int i = 0; i < capabilities.length; i++) {
-			meta.addContent(CapabilityImpl.toXML(capabilities[i]));
-		}
-
-		Requirement[] requirements = resource.getRequirements();
-		for (int i = 0; i < requirements.length; i++) {
-			meta.addContent(RequirementImpl.toXML(requirements[i]));
-		}
-		return meta;
-	}
-
-	public URL getURL() {
-		return url;
-	}
-
-	static String makeRelative(URL repository, URL url) {
-		try {
-			if (repository != null) {
-				String a = url.toExternalForm();
-				String b = repository.toExternalForm();
-				int index = b.lastIndexOf('/');
-				if ( index > 0 )
-					b = b.substring(0,index+1);
-				if (a.startsWith(b))
-					return a.substring(b.length());
-			}
-		}
-		catch (Exception e) {
-			// Ignore
-		}
-		return url.toExternalForm();
-	}
-
-	public void setURL(URL url) {
-		this.url = url;
-		if (url != null)
-			map.put(URL, url);
-	}
-
-	public String getCopyright() {
-		return (String) map.get(COPYRIGHT);
-	}
-
-	public Version getVersion() {
-		if (version == null)
-			version = new VersionRange("0");
-		return version.low;
-	}
-
-	void setVersion(VersionRange version) {
-		if (version == null)
-			this.version = new VersionRange("0");
-		else
-			this.version = version;
-	}
-
-	public void setCopyright(String copyright) {
-		if (copyright != null)
-			map.put(COPYRIGHT, copyright);
-	}
-
-	public URL getDocumentation() {
-		return (URL) map.get(DOCUMENTATION_URL);
-	}
-
-	public void setDocumentation(URL documentation) {
-		if (documentation != null)
-			map.put(DOCUMENTATION_URL, documentation);
-	}
-
-	public URL getSource() {
-		return (URL) map.get(SOURCE_URL);
-	}
-
-	public void setSource(URL source) {
-		if (source != null)
-			map.put(SOURCE_URL, source);
-	}
-
-	public boolean satisfies(RequirementImpl requirement) {
-		for (Iterator i = capabilities.iterator(); i.hasNext();) {
-			CapabilityImpl capability = (CapabilityImpl) i.next();
-			if (requirement.isSatisfied(capability))
-				return true;
-		}
-		return false;
-	}
-
-	public String toString() {
-		return symbolicName + "-" + version;
-	}
-
-	public long getSize() {
-		return size;
-	}
-
-	public void setSize(long size) {
-		this.size = size;
-		map.put(SIZE, new Long(size));
-	}
-
-	public Collection getRequirementList() {
-		return requirements;
-	}
-
-	public Collection getCapabilityList() {
-		return capabilities;
-	}
-
-	public int hashCode() {
-		return symbolicName.hashCode() ^ version.hashCode();
-	}
-
-	public boolean equals(Object o) {
-		try {
-			ResourceImpl other = (ResourceImpl) o;
-			return symbolicName.equals(other.symbolicName)
-					&& version.equals(other.version);
-		}
-		catch (ClassCastException e) {
-			return false;
-		}
-	}
-
-	public String[] getCategories() {
-		return (String[]) categories.toArray(new String[categories.size()]);
-	}
-
-	public Map getProperties() {
-		return Collections.unmodifiableMap(map);
-	}
-
-	public synchronized String getId() {
-		if ( id == null )
-			id = symbolicName + "/" + version;
-		return id;
-	}
-
-	public Repository getRepository() {
-		return repository;
-	}
-
-	void setName(String value) {
-		this.symbolicName = value;
-	}
-
-	void put(String name, Object value) {
-		map.put(name, value);
-	}
-
-	public void setPresentationName(String name) {
-		presentationName = name;
-		if (name != null)
-			map.put(PRESENTATION_NAME, name);
-	}
-
-	public String getPresentationName() {
-		return presentationName;
-	}
-
-	public void setFile(File zipFile) {
-		file = zipFile;
-	}
-
-	public Set getExtendList() {
-		Set set = new HashSet();
-		for (Iterator i = requirements.iterator(); i.hasNext();) {
-			RequirementImpl	impl = (RequirementImpl) i.next();
-			if ( impl.isExtend())
-				set.add(impl);
-		}
-		return set;
-	}
-
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/StringSet.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/StringSet.java
deleted file mode 100644
index d2bbd5d..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/StringSet.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * $Id: StringSet.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import java.util.*;
-
-public class StringSet extends HashSet {
-	static final long	serialVersionUID	= 1L;
-
-	public StringSet(String set) {
-		StringTokenizer st = new StringTokenizer(set, ",");
-		while (st.hasMoreTokens())
-			add(st.nextToken().trim());
-	}
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/Tag.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/Tag.java
deleted file mode 100644
index 3c1375f..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/Tag.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- * $Id: Tag.java 44 2007-07-13 20:49:41Z hargrave@us.ibm.com $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import java.io.*;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-/**
- * The Tag class represents a minimal XML tree. It consist of a named element
- * with a hashtable of named attributes. Methods are provided to walk the tree
- * and get its constituents. The content of a Tag is a list that contains String
- * objects or other Tag objects.
- */
-public class Tag {
-	Tag						parent;
-	String					name;
-	Map						attributes	= new TreeMap();
-	Vector					content		= new Vector();
-
-	static SimpleDateFormat	format		= new SimpleDateFormat(
-												"yyyyMMddhhmmss.SSS");
-
-	/**
-	 * Construct a new Tag with a name.
-	 */
-	public Tag(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * Construct a new Tag with a name.
-	 */
-	public Tag(String name, Map attributes) {
-		this.name = name;
-		this.attributes = attributes;
-	}
-
-	/**
-	 * Construct a new Tag with a name and a set of attributes. The attributes
-	 * are given as ( name, value ) ...
-	 */
-	public Tag(String name, String[] attributes) {
-		this.name = name;
-		for (int i = 0; i < attributes.length; i += 2)
-			addAttribute(attributes[i], attributes[i + 1]);
-	}
-
-	/**
-	 * Construct a new Tag with a single string as content.
-	 */
-	public Tag(String name, String content) {
-		this.name = name;
-		addContent(content);
-	}
-
-	/**
-	 * Add a new attribute.
-	 */
-	public void addAttribute(String key, String value) {
-		attributes.put(key, value);
-	}
-
-	/**
-	 * Add a new attribute.
-	 */
-	public void addAttribute(String key, Object value) {
-		if (value == null)
-			return;
-		attributes.put(key, value.toString());
-	}
-
-	/**
-	 * Add a new attribute.
-	 */
-	public void addAttribute(String key, int value) {
-		attributes.put(key, Integer.toString(value));
-	}
-
-	/**
-	 * Add a new date attribute. The date is formatted as the SimpleDateFormat
-	 * describes at the top of this class.
-	 */
-	public void addAttribute(String key, Date value) {
-		attributes.put(key, format.format(value));
-	}
-
-	/**
-	 * Add a new content string.
-	 */
-	public void addContent(String string) {
-		content.addElement(string);
-	}
-
-	/**
-	 * Add a new content tag.
-	 */
-	public void addContent(Tag tag) {
-		content.addElement(tag);
-		tag.parent = this;
-	}
-
-	/**
-	 * Return the name of the tag.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Return the attribute value.
-	 */
-	public String getAttribute(String key) {
-		return (String) attributes.get(key);
-	}
-
-	/**
-	 * Return the attribute value or a default if not defined.
-	 */
-	public String getAttribute(String key, String deflt) {
-		String answer = getAttribute(key);
-		return answer == null ? deflt : answer;
-	}
-
-	/**
-	 * Answer the attributes as a Dictionary object.
-	 */
-	public Map getAttributes() {
-		return attributes;
-	}
-
-	/**
-	 * Return the contents.
-	 */
-	public Vector getContents() {
-		return content;
-	}
-
-	/**
-	 * Return a string representation of this Tag and all its children
-	 * recursively.
-	 */
-	public String toString() {
-		StringWriter sw = new StringWriter();
-		print(0, new PrintWriter(sw));
-		return sw.toString();
-	}
-
-	/**
-	 * Return only the tags of the first level of descendants that match the
-	 * name.
-	 */
-	public Vector getContents(String tag) {
-		Vector out = new Vector();
-		for (Enumeration e = content.elements(); e.hasMoreElements();) {
-			Object o = e.nextElement();
-			if (o instanceof Tag && ((Tag) o).getName().equals(tag))
-				out.addElement(o);
-		}
-		return out;
-	}
-
-	/**
-	 * Return the whole contents as a String (no tag info and attributes).
-	 */
-	public String getContentsAsString() {
-		StringBuffer sb = new StringBuffer();
-		getContentsAsString(sb);
-		return sb.toString();
-	}
-
-	/**
-	 * convenient method to get the contents in a StringBuffer.
-	 */
-	public void getContentsAsString(StringBuffer sb) {
-		for (Enumeration e = content.elements(); e.hasMoreElements();) {
-			Object o = e.nextElement();
-			if (o instanceof Tag)
-				((Tag) o).getContentsAsString(sb);
-			else
-				sb.append(o.toString());
-		}
-	}
-
-	/**
-	 * Print the tag formatted to a PrintWriter.
-	 */
-	public void print(int indent, PrintWriter pw) {
-		pw.print("\n");
-		spaces(pw, indent);
-		pw.print('<');
-		pw.print(name);
-
-		for (Iterator e = attributes.keySet().iterator(); e.hasNext();) {
-			String key = (String) e.next();
-			String value = escape((String) attributes.get(key));
-			pw.print(' ');
-			pw.print(key);
-			pw.print("=");
-			String quote = "'";
-			if (value.indexOf(quote) >= 0)
-				quote = "\"";
-			pw.print(quote);
-			pw.print(value);
-			pw.print(quote);
-		}
-
-		if (content.size() == 0)
-			pw.print('/');
-		else {
-			pw.print('>');
-			for (Enumeration e = content.elements(); e.hasMoreElements();) {
-				Object content = e.nextElement();
-				if (content instanceof String) {
-					formatted(pw, indent + 2, 60, escape((String) content));
-				}
-				else if (content instanceof Tag) {
-					Tag tag = (Tag) content;
-					tag.print(indent + 2, pw);
-				}
-			}
-			pw.print("\n");
-			spaces(pw, indent);
-			pw.print("</");
-			pw.print(name);
-		}
-		pw.print('>');
-	}
-
-	/**
-	 * Convenience method to print a string nicely and does character conversion
-	 * to entities.
-	 */
-	void formatted(PrintWriter pw, int left, int width, String s) {
-		int pos = width + 1;
-		s = s.trim();
-
-		for (int i = 0; i < s.length(); i++) {
-			char c = s.charAt(i);
-			if (i == 0 || (Character.isWhitespace(c) && pos > width - 3)) {
-				pw.print("\n");
-				spaces(pw, left);
-				pos = 0;
-			}
-			switch (c) {
-				case '<' :
-					pw.print("&lt;");
-					pos += 4;
-					break;
-				case '>' :
-					pw.print("&gt;");
-					pos += 4;
-					break;
-				case '&' :
-					pw.print("&amp;");
-					pos += 5;
-					break;
-				default :
-					pw.print(c);
-					pos++;
-					break;
-			}
-
-		}
-	}
-
-	/**
-	 * Escape a string, do entity conversion.
-	 */
-	String escape(String s) {
-		if  ( s == null )
-			return "?null?";
-		
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0; i < s.length(); i++) {
-			char c = s.charAt(i);
-			switch (c) {
-				case '<' :
-					sb.append("&lt;");
-					break;
-				case '>' :
-					sb.append("&gt;");
-					break;
-				case '&' :
-					sb.append("&amp;");
-					break;
-				default :
-					sb.append(c);
-					break;
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Make spaces.
-	 */
-	void spaces(PrintWriter pw, int n) {
-		while (n-- > 0)
-			pw.print(' ');
-	}
-
-	/**
-	 * root/preferences/native/os
-	 */
-	public Tag[] select(String path) {
-		return select(path, (Tag) null);
-	}
-
-	public Tag[] select(String path, Tag mapping) {
-		Vector v = new Vector();
-		select(path, v, mapping);
-		Tag[] result = new Tag[v.size()];
-		v.copyInto(result);
-		return result;
-	}
-
-	void select(String path, Vector results, Tag mapping) {
-		if (path.startsWith("//")) {
-			int i = path.indexOf('/', 2);
-			String name = path.substring(2, i < 0 ? path.length() : i);
-
-			for (Enumeration e = content.elements(); e.hasMoreElements();) {
-				Object o = e.nextElement();
-				if (o instanceof Tag) {
-					Tag child = (Tag) o;
-					if (match(name, child, mapping))
-						results.add(child);
-					child.select(path, results, mapping);
-				}
-
-			}
-			return;
-		}
-
-		if (path.length() == 0) {
-			results.addElement(this);
-			return;
-		}
-
-		int i = path.indexOf("/");
-		String elementName = path;
-		String remainder = "";
-		if (i > 0) {
-			elementName = path.substring(0, i);
-			remainder = path.substring(i + 1);
-		}
-
-		for (Enumeration e = content.elements(); e.hasMoreElements();) {
-			Object o = e.nextElement();
-			if (o instanceof Tag) {
-				Tag child = (Tag) o;
-				if (child.getName().equals(elementName)
-						|| elementName.equals("*"))
-					child.select(remainder, results, mapping);
-			}
-		}
-	}
-
-	public boolean match(String search, Tag child, Tag mapping) {
-		String target = child.getName();
-		String sn = null;
-		String tn = null;
-
-		if (search.equals("*"))
-			return true;
-
-		int s = search.indexOf(':');
-		if (s > 0) {
-			sn = search.substring(0, s);
-			search = search.substring(s + 1);
-		}
-		int t = target.indexOf(':');
-		if (t > 0) {
-			tn = target.substring(0, t);
-			target = target.substring(t + 1);
-		}
-
-		if (!search.equals(target)) // different tag names
-			return false;
-
-		if (mapping == null) {
-			return tn == sn || (sn != null && sn.equals(tn));
-		}
-		else {
-			String suri = sn == null ? mapping.getAttribute("xmlns") : mapping
-					.getAttribute("xmlns:" + sn);
-			String turi = tn == null ? child.findRecursiveAttribute("xmlns")
-					: child.findRecursiveAttribute("xmlns:" + tn);
-			return turi == suri
-					|| (turi != null && suri != null && turi.equals(suri));
-		}
-	}
-
-	public String getString(String path) {
-		String attribute = null;
-		int index = path.indexOf("@");
-		if (index >= 0) {
-			// attribute
-			attribute = path.substring(index + 1);
-
-			if (index > 0) {
-				// prefix path
-				path = path.substring(index - 1); // skip -1
-			}
-			else
-				path = "";
-		}
-		Tag tags[] = select(path);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0; i < tags.length; i++) {
-			if (attribute == null)
-				tags[i].getContentsAsString(sb);
-			else
-				sb.append(tags[i].getAttribute(attribute));
-		}
-		return sb.toString();
-	}
-
-	public String getStringContent() {
-		StringBuffer sb = new StringBuffer();
-		for (Enumeration e = content.elements(); e.hasMoreElements();) {
-			Object c = e.nextElement();
-			if (!(c instanceof Tag))
-				sb.append(c);
-		}
-		return sb.toString();
-	}
-
-	public String getNameSpace() {
-		return getNameSpace(name);
-	}
-
-	public String getNameSpace(String name) {
-		int index = name.indexOf(':');
-		if (index > 0) {
-			String ns = name.substring(0, index);
-			return findRecursiveAttribute("xmlns:" + ns);
-		}
-		else
-			return findRecursiveAttribute("xmlns");
-	}
-
-	public String findRecursiveAttribute(String name) {
-		String value = getAttribute(name);
-		if (value != null)
-			return value;
-		if (parent != null)
-			return parent.findRecursiveAttribute(name);
-		return null;
-	}
-
-	public String getLocalName() {
-		int index = name.indexOf(':');
-		if (index <= 0)
-			return name;
-
-		return name.substring(index + 1);
-	}
-
-	public void rename(String string) {
-		name = string;
-	}
-
-
-	public static void convert( Collection c, String type, Tag parent ) {
-		for ( Iterator i=c.iterator(); i.hasNext(); ) {
-			Map	map = (Map) i.next();
-			parent.addContent( new Tag(type, map) );
-		}
-	}
-
-}
diff --git a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/VersionRange.java b/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/VersionRange.java
deleted file mode 100644
index afc99fc..0000000
--- a/maven-obr-plugin/src/main/java/org/osgi/impl/bundle/obr/resource/VersionRange.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * $Id: VersionRange.java 45 2007-10-01 12:56:02Z peter.kriens@aqute.biz $
- * 
- * Copyright (c) OSGi Alliance (2002, 2006, 2007). 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.osgi.impl.bundle.obr.resource;
-
-import java.util.regex.*;
-
-import org.osgi.framework.*;
-
-public class VersionRange implements Comparable {
-	Version high;
-	Version low;
-	char start = '[';
-	char end = ']';
-
-	static String V = "\\s*[0-9]+(\\.[0-9]+(\\.[0-9]+(\\.[a-zA-Z0-9_-]+)?)?)?\\s*";
-	static Pattern RANGE = Pattern.compile("(\\(|\\[)(" + V + "),(" + V
-			+ ")(\\)|\\])");
-
-	public VersionRange(String string) {
-		string = string.trim();
-		Matcher m = RANGE.matcher(string);
-		if (m.matches()) {
-			start = m.group(1).charAt(0);
-			low = new Version(m.group(2).trim());
-			high = new Version(m.group(6).trim());
-			end = m.group(10).charAt(0);
-			if (low.compareTo(high) >= 0)
-				throw new IllegalArgumentException(
-						"Low Range is higher than High Range: " + low + "-"
-								+ high);
-
-		} else
-			high = low = new Version(string);
-	}
-
-	public boolean isRange() {
-		return high != low;
-	}
-
-	public boolean includeLow() {
-		return start == '[';
-	}
-
-	public boolean includeHigh() {
-		return end == ']';
-	}
-
-	public String toString() {
-		if (high == low)
-			return high.toString();
-
-		StringBuffer sb = new StringBuffer();
-		sb.append(start);
-		sb.append(low);
-		sb.append(',');
-		sb.append(high);
-		sb.append(end);
-		return sb.toString();
-	}
-
-	public boolean equals(Object other) {
-		if (other instanceof VersionRange) {
-			return compareTo(other)==0;
-		}
-		return false;
-	}
-
-	public int hashCode() {
-		return low.hashCode() * high.hashCode();
-	}
-
-	public int compareTo(Object other) {
-		VersionRange range = (VersionRange) other;
-		VersionRange a = this, b = range;
-		if (range.isRange()) {
-			a = range;
-			b = this;
-		} else {
-			if ( !isRange() )
-				return low.compareTo(range.high);
-		}
-		int l = a.low.compareTo(b.low);
-		boolean ll = false;
-		if (a.includeLow())
-			ll = l <= 0;
-		else
-			ll = l < 0;
-
-		if (!ll)
-			return -1;
-
-		int h = a.high.compareTo(b.high);
-		if (a.includeHigh())
-			ll = h >= 0;
-		else
-			ll = h > 0;
-
-		if (ll)
-			return 0;
-		else
-			return 1;
-	}
-}
\ No newline at end of file
diff --git a/maven-obr-plugin/src/main/resources/SchemaObr.xsd b/maven-obr-plugin/src/main/resources/SchemaObr.xsd
deleted file mode 100644
index 63b63e9..0000000
--- a/maven-obr-plugin/src/main/resources/SchemaObr.xsd
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT 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 xmlns:xs="http://www.w3.org/2001/XMLSchema">
-<!-- definition of simple elements -->
-
-<!-- definition of attribute  -->
-<xs:attribute name="name"     type="xs:string"/>
-<xs:attribute name="filter"   type="xs:string"/>
-<xs:attribute name="extend"   type="xs:boolean"/>
-<xs:attribute name="multiple" type="xs:boolean"/>
-<xs:attribute name="optional" type="xs:boolean"/>
-<xs:attribute name="id" type="xs:string"/>
-<xs:attribute name="n" type="xs:string"/>
-<xs:attribute name="v" type="xs:string"/>
-<xs:attribute name="t" type="xs:string"/>
-
-<xs:element name="require">
-  <xs:complexType mixed="true">
-    <xs:attribute ref="name"     use="required"/>
-    <xs:attribute ref="filter"   use="required"/>
-    <xs:attribute ref="extend"   use="required"/>
-    <xs:attribute ref="multiple" use="required"/>
-    <xs:attribute ref="optional" use="required"/>
-  </xs:complexType>
-</xs:element>
-
-<xs:element name="category">
-  <xs:complexType>
-	<xs:attribute ref="id" use="required"/>
-  </xs:complexType>
-</xs:element>
-
-<xs:element name="p">
-  <xs:complexType>
-	<xs:attribute ref="n" use="required"/>
-    <xs:attribute ref="v" use="required"/>
-    <xs:attribute ref="t" />
-  </xs:complexType>
-</xs:element>
-
-
-<xs:element name="capability">
-  <xs:complexType>
-    <xs:sequence>
-  		<xs:element ref="p" minOccurs="0" maxOccurs="unbounded"/>
-	</xs:sequence>
-  </xs:complexType>
-</xs:element>
-
-<xs:element name="resource">
-  <xs:complexType>
-    <xs:sequence>
-		  <xs:element ref="capability" minOccurs="0" maxOccurs="unbounded"/> 
-		  <xs:element ref="require" minOccurs="0" maxOccurs="unbounded"/> 
-		  <xs:element ref="category" minOccurs="0" maxOccurs="unbounded"/> 
-	</xs:sequence>
-  </xs:complexType>
-</xs:element>
-</xs:schema>
diff --git a/pom.xml b/pom.xml
index 6b58182..930b8c7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -77,11 +77,8 @@
         </property>
       </activation>
       <modules>
-        <module>maven-obr-plugin</module>
         <module>bundleplugin</module>
         <module>scrplugin</module>
-        <module>tools/maven2/maven-osgi-plugin</module>
-<!--        <module>tools/maven2/maven-felix-plugin</module> -->
       </modules>
     </profile>
 
@@ -144,10 +141,6 @@
       </activation>
       <modules>
         <module>org.apache.felix.daemon</module>
-
-        <!--    <module>tools/mangen</module> -->
-
-
       </modules>
     </profile>
 
