diff --git a/sigil/LICENSE b/sigil/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/sigil/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/sigil/bldcommon/build.properties b/sigil/bldcommon/build.properties
deleted file mode 100644
index f3b92eb..0000000
--- a/sigil/bldcommon/build.properties
+++ /dev/null
@@ -1,45 +0,0 @@
-# common properties
-# easier to set here than in xml file
-
-buildRelease    = 0.9.0
-buildQualifier  = SNAPSHOT
-buildVersion    = ${buildRelease}.${buildQualifier}
-
-update.site=http://ci.codecauldron.org/hudson/job/sigil-apache-daily/lastSuccessfulBuild/artifact/sigil/site/
-
-# set common.dir when used without ant (e.g. IvyDE)
-common.dir	= ${ivy.settings.dir}
-
-ivy.jar		= ${common.dir}/sigil/ivy-2.0.0-rc1.jar
-sigil-ivy-plugin.jar = ${common.dir}/sigil/sigil-ivy-plugin.jar
-
-build.dir	= ${basedir}/build
-build_xml	= build.xml
-classes.dir	= ${build.dir}/main-classes
-deps.dir	= ${build.dir}/deps
-composite.dir	= ${basedir}/xml
-src.dir		= ${basedir}/src
-ivy.file	= ${basedir}/ivy.xml
-
-_build.dir	= ${build.dir}
-build.lib.dir	= ${_build.dir}/lib
-build.etc.dir	= ${_build.dir}/etc
-
-top-build.dir	= ${common.dir}/../build
-site.dir	= ${common.dir}/../site
-dist.dir	= ${top-build.dir}/dist
-install.dir	= ${top-build.dir}/install
-repository.dir	= ${top-build.dir}/repository
-cache.dir	= ${common.dir}/../cache
-# note: clean-local task assumes repository.pattern starts with ${ivy.module}
-repository.pattern = [module]/[revision]/[type]s/[artifact].[ext]
-
-ivy.install.version=2.0.0
-bnd.install.version=0.0.401
-equinox.install.version=3.4.0.v20080421-2006
-equinox.release=ganymede
-
-resolve.log	= download-only
-
-# end
-
diff --git a/sigil/bldcommon/common.xml b/sigil/bldcommon/common.xml
deleted file mode 100644
index e7424e1..0000000
--- a/sigil/bldcommon/common.xml
+++ /dev/null
@@ -1,363 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="bldcommon" 
-         xmlns:ivy="antlib:org.apache.ivy.ant"
-         xmlns:groovy="antlib:org.codehaus.groovy">
-    
-    <dirname property="common.dir" file="${ant.file.bldcommon}"/>
-    <property file="${common.dir}/build.properties"/>
-
-    <!-- =====================================================
-         stuff intended to be over-ridden is prefixed with my.
-         =====================================================-->
-
-    <fileset id="my.projects" dir="${basedir}">
-      <include name="**/${build_xml}"/>
-    </fileset>
-
-    <path id="my.classpath">
-        <fileset dir="${basedir}" includes="lib/*.jar"/>
-    </path>
-
-    <path id="javac.classpath">
-	<path refid="my.classpath"/>
-        <fileset dir="${deps.dir}" />
-    </path>
-
-    <path id="sigil.classpath">
-        <path refid="javac.classpath" />
-        <path location="${classes.dir}" />
-    </path>
-
-    <!-- ================================= 
-          target: load-ivy
-         ================================= -->
-    <target name="load-ivy" depends="init-sigil">
-	<echo message="Loading Ivy ... ${common.dir}/ivysettings.xml"/>
-	<ivy:settings file="${common.dir}/ivysettings.xml" />
-    </target>
-
-    <target name="load-groovy">
-        <ivy:cachepath 
-             organisation="org.codehaus.groovy" 
-             module="groovy-all" 
-             revision="1.6.4" 
-             inline="true" 
-             pathid="groovy.classpath" 
-             transitive="false" 
-             log="quiet"/>
-
-        <taskdef resource="org/codehaus/groovy/antlib.xml"
-             uri="antlib:org.codehaus.groovy" classpathref="groovy.classpath"/>
-    </target>
-
-    <!-- ================================= 
-          target: build (default target)
-         ================================= -->
-    <target name="build" depends="publish-local" />
-
-    <target name="ident">
-      <echo message="${ant.project.name}"/>
-    </target>
-
-    <!-- ================================= 
-          target: resolve              
-         ================================= -->
-    <target name="resolve" depends="common-init"
-    	description="--> resolve and retrieve dependencies with ivy">
-	<mkdir dir="${deps.dir}"/>
-    	<ivy:resolve file="${ivy.file}" log="${resolve.log}"/>
-    	<ivy:retrieve pattern="${deps.dir}/[artifact].[ext]"
-		symlink="true" sync="true"/>
-    	<!-- sync=true removes empty deps dir, so re-create it -->
-	<mkdir dir="${deps.dir}"/>
-    </target>
-
-    <!-- ================================= 
-          target: publish-local
-         ================================= -->
-
-    <target name="publish-check" unless="bundle.modified">
-      <ivy:info file="${ivy.file}"/>
-      <condition property="bundle.modified">
-	<not>
-	  <available file="${repository.dir}/local/${ivy.module}" type="dir"/>
-	</not>
-      </condition>
-    </target>
-
-    <target name="publish-local" depends="bundle, publish-check" if="bundle.modified"
-    	description="--> publish project in the local repository">
-
-	<tstamp>
-	    <format property="now" pattern="yyyyMMddHHmmss"/>
-	</tstamp>
-        <property name="local-version" value="${now}"/>
-
-	<antcall target="clean-local"/>
-    	<ivy:publish artifactspattern="${build.lib.dir}/[artifact].[ext]" 
-		       resolver="local"
-		       pubrevision="${local-version}" 
-		       pubdate="${now}"
-		       forcedeliver="true"
-		       status="integration"/>
-        <echo message="project ${ant.project.name} published locally with version ${local-version}" />
-    </target>
-
-    <!-- ================================= 
-          target: report              
-         ================================= -->
-    <target name="report" depends="resolve"
-    	description="--> generates a report of dependencies">
-        <ivy:report todir="${build.dir}"/>
-    </target>
-    
-    <!-- ================================= 
-          target: compile              
-         ================================= -->
-    <target name="compile" depends="resolve"
-    	description="--> compile the project">
-        <!-- uncomment the following to debug classpath -->
-        <!--pathconvert property="cp" refid="javac.classpath"/>
-        <echo>Classpath - ${cp}</echo-->
-        <mkdir dir="${classes.dir}" />
-        <javac srcdir="${src.dir}"
-		destdir="${classes.dir}"
-		classpathref="javac.classpath"
-		target="1.5"
-		debug="true" />
-    </target>
-    
-    <!-- ================================= 
-          target: bundle
-         ================================= -->
-    <target name="bundle" depends="compile"
-    	description="--> build OSGi bundle(s) for this project">
-	<mkdir dir="${build.lib.dir}"/>
-        <sigil.bundle
-                classpathref="sigil.classpath"
-		destpattern="${build.lib.dir}/[name].[ext]"
-		force="${bundle.force}"
-		property="bundle.modified" />
-    </target>
-
-    <available file="bin" type="dir"
-               property="bin.dir.present"/>
-    <available file="etc" type="dir"
-               property="etc.dir.present"/>
-
-    <target name="install-bin" if="bin.dir.present">
-	<mkdir dir="${install.dir}/bin"/>
-	<copy todir="${install.dir}/bin">
-	  <fileset dir="bin" />
-	</copy>
-	<chmod dir="${install.dir}/bin" perm="755" excludes="*.bat"/>
-    </target>
-
-    <target name="install-etc" if="etc.dir.present">
-	<mkdir dir="${install.dir}/etc"/>
-	<copy todir="${install.dir}/etc">
-	  <fileset dir="etc" />
-	</copy>
-    </target>
-
-    <target name="libs-available">
-      <available file="${build.lib.dir}" type="dir"
-               property="build.lib.dir.present"/>
-    </target>
-
-    <target name="install-lib"
-	 depends="publish-local, libs-available"
-	      if="build.lib.dir.present">
-	<copy todir="${install.dir}/lib">
-	  <fileset dir="${build.lib.dir}" />
-	  <mapper type="glob" from="*.jar" to="*-${buildVersion}.jar"/>
-	</copy>
-    </target>
-
-    <!-- ================================= 
-	  target: clean-local              
-	 ================================= -->
-    <target name="clean-local" depends="boot"
-    	description="--> cleans the local repository for the current module">
-       <ivy:info file="${ivy.file}"/>
-       <delete dir="${repository.dir}/local/${ivy.module}"/>
-    </target>
-
-    <!-- ================================= 
-	  target: clean-deps              
-	 ================================= -->
-    <target name="clean-deps"
-    	description="--> clean the project dependencies directory">
-	<delete includeemptydirs="true" dir="${deps.dir}"/>
-    </target>
-
-    <!-- ================================= 
-          target: clean-build              
-         ================================= -->
-    <target name="clean-build"
-    	description="--> clean the project built files">
-        <delete includeemptydirs="true" dir="${build.dir}"/>
-    </target>
-
-    <!-- ================================= 
-          target: clean              
-         ================================= -->
-    <target name="clean" depends="ident, clean-build, clean-deps"
-    	description="--> clean the project" />
-
-
-    <!-- ================================= 
-          target: boot
-         ================================= -->
-    <target name="boot" depends="load-ivy,load-groovy">
-    </target>
-
-    <!-- ================================= 
-          target: common-init
-         ================================= -->
-    <target name="common-init" depends="ident,boot,init">
-    </target>
-
-    <!-- ================================= 
-          target: init
-         ================================= -->
-    <target name="init">
-    </target>
-
-    <!-- ================================= 
-          target: buildlist
-         ================================= -->
-    <target name="buildlist" depends="common-init">
-      <ivy:buildlist reference="ordered-list"
-		  onMissingDescriptor="skip">
-	<fileset refid="my.projects"/>
-      </ivy:buildlist>
-    </target>
-
-    <!-- ================================= 
-          target: build-list
-         ================================= -->
-    <target name="build-list" depends="buildlist" 
-	  description="--> build all projects in the right order">
-      <property name="target" value="build"/>
-      <subant target="${target}" buildpathref="ordered-list">
-	<propertyset>
-	  <propertyref name="ivy.loaded" />
-	</propertyset>
-      </subant>
-    </target>
-
-    <!-- ================================= 
-          target: report-list
-         ================================= -->
-    <target name="report-list"
-	  description="--> report all projects">
-      <antcall target="build-list">
-        <param name="target" value="report"/>
-      </antcall>
-    </target>
-
-    <!-- ================================= 
-          target: install-list
-         ================================= -->
-    <target name="install-list"
-	  description="--> install all projects">
-      <antcall target="build-list">
-        <param name="target" value="install"/>
-      </antcall>
-    </target>
-
-    <!-- ================================= 
-          target: ident-list
-         ================================= -->
-    <target name="ident-list"
-	  description="--> identify projects">
-      <antcall target="build-list">
-        <param name="target" value="ident"/>
-      </antcall>
-    </target>
-
-    <!-- ================================= 
-          target: clean-list
-         ================================= -->
-    <target name="clean-list"
-	  description="--> clean all projects">
-      <antcall target="build-list">
-        <param name="target" value="clean"/>
-      </antcall>
-    </target>
-
-    <!-- ================================= 
-          target: clean-all
-         ================================= -->
-    <target name="clean-all" depends="clean-list, clean" 
-    description="--> clean repository, cache, and all projects">
-      <delete dir="${repository.dir}"/>
-      <delete dir="${cache.dir}"/>
-      <delete dir="${install.dir}"/>
-      <delete dir="${dist.dir}"/>
-    </target>
-
-  <property name="sigil.home" value="${cache.dir}/ant" />
-  <property name="sigil.jar.dir" value="${sigil.home}/lib" />
-  <property name="ivy.jar.file" value="${sigil.jar.dir}/ivy.jar" />
-  <property name="sigil.jar.file" value="${sigil.jar.dir}/sigil-ivy-plugin.jar" />
-
-
-  <target name="download-deps" unless="offline">
-    <property name="deps.loaded" value="true"/>
-    <mkdir dir="${sigil.jar.dir}"/>
-    <!-- ivy -->
-    <get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
-         dest="${ivy.jar.file}" usetimestamp="true" verbose="true"/>
-    <!-- sigil -->
-    <get src="http://people.apache.org/~dsavage/sigil/sigil-ivy-plugin.jar"
-         dest="${sigil.jar.file}" usetimestamp="true" verbose="true"/>
-  </target>
-
-  <target name="check-sigil">
-    <condition property="sigil.loaded">
-      <typefound name="sigil.bundle" />
-    </condition>
-  </target>
-
-  <target name="init-sigil" depends="check-sigil" unless="sigil.loaded">
-    <antcall target="download-deps" />
-    <!-- try to load ivy here from ivy home, in case the user has not already dropped
-         it into ant's lib dir (note that the latter copy will always take precedence).
-         We will not fail as long as local lib dir exists (it may be empty) and
-         ivy is in at least one of ant's lib dir or the local lib dir. -->
-    <path id="sigil.lib.path">
-      <fileset dir="${sigil.jar.dir}" includes="*.jar"/>
-    </path>
-
-    <taskdef resource="org/apache/ivy/ant/antlib.xml"
-             uri="antlib:org.apache.ivy.ant" classpathref="sigil.lib.path"/>
-
-    <taskdef name="sigil.bundle"
-             classname="org.apache.felix.sigil.ant.BundleTask" classpathref="sigil.lib.path"/>
-
-    <taskdef name="sigil.bundle.info"
-             classname="org.apache.felix.sigil.ant.BundleInfoTask" classpathref="sigil.lib.path"/>
-
-  </target>
-	
-</project>
diff --git a/sigil/bldcommon/ivysettings.xml b/sigil/bldcommon/ivysettings.xml
deleted file mode 100644
index 12d0b95..0000000
--- a/sigil/bldcommon/ivysettings.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivysettings>
-  <properties file="${ivy.settings.dir}/build.properties" override="false"/>
-  <caches defaultCacheDir="${cache.dir}/all" />
-
-  <settings defaultResolver="default" circularDependencyStrategy="error" />
-
-  <!--
-  <classpath file="${sigil-ivy-plugin.jar}" />
-  Ant tasks "subant" and "ant" cause IvySettings to be re-loaded, 
-  which then re-loads SigilParser in a new URLClassLoader,
-  which causes ProjectRepository to be re-initialised. Outch!
-  Loading sigil-ivy-plugin.jar in load-ivy task, uses the same ClassLoader
-  and thus avoids re-initialising ProjectRepositiory.
-  Search for Derek Baum in the October 2008 ant-dev archives for my attempt
-  at getting the Ivy communiuty to fix this.
-  http://mail-archives.apache.org/mod_mbox/ant-dev/200810.mbox/browser
-  -->
-  <typedef name="sigil-parser" classname="org.apache.felix.sigil.ivy.SigilParser" />
-  <typedef name="sigil" classname="org.apache.felix.sigil.ivy.SigilResolver" />
-
-  <parsers>
-    <sigil-parser config="${ivy.settings.dir}/sigil-defaults.properties"
-    		quiet="true"/>
-  </parsers>
-
-  <resolvers>
-    <sigil name="sigil"
-	   config="${ivy.settings.dir}/sigil-defaults.properties"
-	   extractBCP="true"
-           cache="sigil"/>
-
-    <chain name="default" returnFirst="true">
-      <filesystem name="local">
-        <ivy pattern="${repository.dir}/local/${repository.pattern}" />
-        <artifact pattern="${repository.dir}/local/${repository.pattern}" />
-      </filesystem>
-
-      <filesystem name="shared">
-        <ivy pattern="${repository.dir}/shared/${repository.pattern}" />
-        <artifact pattern="${repository.dir}/shared/${repository.pattern}" />
-      </filesystem>
-    </chain>
-
-    <url name="eclipse">
-      <artifact pattern="http://download.eclipse.org/releases/ganymede/plugins/[module]_[revision].[ext]" />
-      <artifact pattern="http://download.eclipse.org/releases/ganymede/[module].[artifact]_[revision].[ext]" />
-    </url>
-
-    <url name="apache" m2compatible="true">
-      <artifact pattern="http://repo1.maven.org/maven2/[organisation]/[module]/[artifact]/[revision]/[artifact]-[revision].[ext]"/>
-      <artifact pattern="http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"/>
-    </url>
-
-    <url name="aQute" m2compatible="true">
-      <artifact pattern="http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"/>
-    </url>
-  </resolvers>
-
-  <caches>
-    <cache name="sigil" basedir="${cache.dir}/sigil" />
-  </caches>
-
-  <modules>
-    <module organisation="sigil" resolver="sigil"/>
-    <module organisation="org.eclipse" resolver="eclipse"/>
-    <module organisation="org.apache" name="felix\.sigil.*" matcher="regexp" resolver="default"/>
-    <module organisation="org.apache" resolver="apache"/>
-    <module organisation="biz.aQute" resolver="aQute"/>
-    <module organisation="org.codehaus.groovy" resolver="apache" />
-  </modules>
-</ivysettings>
diff --git a/sigil/bldcommon/prepare/build.xml b/sigil/bldcommon/prepare/build.xml
deleted file mode 100644
index cc68ee9..0000000
--- a/sigil/bldcommon/prepare/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="prepare" default="resolve">
-      <import file="../common.xml"/>
-</project>
diff --git a/sigil/bldcommon/prepare/ivy.xml b/sigil/bldcommon/prepare/ivy.xml
deleted file mode 100644
index 5021a81..0000000
--- a/sigil/bldcommon/prepare/ivy.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info organisation="org.apache"
-        module="felix.sigil.bldcommon.prepare"
-        status="integration"/>
-
-    <dependencies>
-        <!-- bundles -->
-        <dependency org="org.eclipse" name="org.eclipse.core.commands" rev="3.4.0.I20080509-2000" />
-        <dependency org="org.eclipse" name="org.eclipse.core.contenttype" rev="3.3.0.v20080604-1400" />
-        <dependency org="org.eclipse" name="org.eclipse.core.expressions" rev="3.4.1.r342_v20081203-0800" />
-        <dependency org="org.eclipse" name="org.eclipse.core.jobs" rev="3.4.1.R34x_v20081128" />
-        <dependency org="org.eclipse" name="org.eclipse.core.resources" rev="3.4.2.R34x_v20090126" />
-        <dependency org="org.eclipse" name="org.eclipse.debug.core" rev="3.4.1.v20090106_r342" />
-        <dependency org="org.eclipse" name="org.eclipse.debug.ui" rev="3.4.2.v20090110_r342" />
-        <dependency org="org.eclipse" name="org.eclipse.equinox.common" rev="3.4.0.v20080421-2006" />
-        <dependency org="org.eclipse" name="org.eclipse.jdt.core" rev="3.4.4.v_894_R34x" />
-        <dependency org="org.eclipse" name="org.eclipse.jdt.debug.ui" rev="3.3.1.v20080730_r341" />
-        <dependency org="org.eclipse" name="org.eclipse.jdt.launching" rev="3.4.1.v20080729_r341" />
-        <dependency org="org.eclipse" name="org.eclipse.jdt.ui" rev="3.4.2.r342_v20090107-0800" />
-        <dependency org="org.eclipse" name="org.eclipse.jface.text" rev="3.4.2.r342_v20081119-0800" />
-        <dependency org="org.eclipse" name="org.eclipse.jface" rev="3.4.2.M20090107-0800" />
-        <dependency org="org.eclipse" name="org.eclipse.ltk.core.refactoring" rev="3.4.2.r342_v20081028-0800" />
-        <dependency org="org.eclipse" name="org.eclipse.ltk.ui.refactoring" rev="3.4.1.r341_v20080716-0800" />
-        <dependency org="org.eclipse" name="org.eclipse.swt.carbon.macosx" rev="3.4.1.v3452b" />
-        <dependency org="org.eclipse" name="org.eclipse.ui.cheatsheets" rev="3.3.101.v20080702_34x" />
-        <dependency org="org.eclipse" name="org.eclipse.ui.console" rev="3.3.1.v20090128_r342" />
-        <dependency org="org.eclipse" name="org.eclipse.ui.editors" rev="3.4.0.v20080603-2000" />
-        <dependency org="org.eclipse" name="org.eclipse.ui.forms" rev="3.3.103.v20081027_34x" />
-        <dependency org="org.eclipse" name="org.eclipse.ui.ide" rev="3.4.2.M20090127-1700" />
-        <dependency org="org.eclipse" name="org.eclipse.ui.workbench" rev="3.4.2.M20090127-1700" />
-        <!-- zest -->
-        <dependency org="org.eclipse" name="org.eclipse.draw2d" rev="3.4.2.v20090114-1330" />
-        <dependency org="org.eclipse" name="org.eclipse.zest.core" rev="1.0.0.v20080115" />
-        <dependency org="org.eclipse" name="org.eclipse.zest.layouts" rev="1.0.0.v20080226" />
-	<!-- fragments -->
-        <dependency org="org.eclipse" name="org.eclipse.core.runtime" rev="3.4.0.v20080512" />
-        <dependency org="org.eclipse" name="org.eclipse.equinox.preferences" rev="3.2.201.R34x_v20080709" />
-        <dependency org="org.eclipse" name="org.eclipse.equinox.registry" rev="3.4.0.v20080516-0950" />
-        <dependency org="org.eclipse" name="org.eclipse.swt" rev="3.4.2.v3452b" />
-        <dependency org="org.eclipse" name="org.eclipse.text" rev="3.4.0.v20080605-1800" />
-        <dependency org="org.eclipse" name="org.eclipse.ui.workbench.texteditor" rev="3.4.1.r341_v20080827-1100" />
-
-        <dependency org="org.apache" name="bcel" rev="5.2">
-          <artifact name="bcel" type="jar" />
-        </dependency>
-
-        <dependency org="biz.aQute" name="bndlib" rev="1.15.0">
-          <artifact name="bndlib" type="jar" />
-        </dependency>
-
-        <dependency org="org.apache" name="felix" rev="1.4.0">
-          <artifact name="org.osgi.core" type="jar" />
-          <artifact name="org.osgi.compendium" type="jar" />
-        </dependency>
-    </dependencies>
-</ivy-module>
diff --git a/sigil/bldcommon/sigil-defaults.properties b/sigil/bldcommon/sigil-defaults.properties
deleted file mode 100644
index fa6093d..0000000
--- a/sigil/bldcommon/sigil-defaults.properties
+++ /dev/null
@@ -1,146 +0,0 @@
-# sigil-defaults.properties
-
-# repository config
--repositories:  system, project, bld-common, felix, spring, bld-ant
-
-system;provider:        system
-
-project;provider:       project
-project;pattern:        \
-        ${..}/common/**/[sigilproject] \
-        ${..}/eclipse/**/[sigilproject] \
-
-bld-ant;provider:       filesystem
-bld-ant;recurse:        true
-bld-ant;dir:            ${cache.dir:-${..}/cache}/ant/lib
-
-bld-common;provider:    filesystem
-bld-common;recurse:     true
-bld-common;dir:         ${cache.dir:-${..}/cache}/all
-
-felix;provider: obr
-felix;url:              http://felix.apache.org/obr/releases.xml 
-felix;index:            ${..}/build/felix.obr
-felix;cache:            ${..}/build/obr-cache
-felix;offline		${offline:-false}
-
-spring;provider:        obr
-spring;url:             http://sigil.codecauldron.org/spring-external.obr
-spring;index:           ${..}/build/spring-external.obr
-spring;cache:           ${..}/build/obr-cache
-spring;offline		${offline:-false}
-
-# Default version of all Sigil projects
-version: 0.9.0.${buildQualifier:-SNAPSHOT}
-
-# Default bundle headers
-header;update-site: ${update.site:-${.}/site}
-header;Bundle-Category: development
-header;Bundle-ContactAddress: http://felix.apache.org
-header;Bundle-Vendor: The Apache Software Foundation
-
-# Default package version ranges
-# if no version specified, BND uses resolved version, dropping minor number
-
-package;org.apache.felix.sigil.*:				0.9.0.${buildQualifier:-SNAPSHOT}
-
-package;aQute.lib.osgi:						0.0.0
-
-# junit
-package;junit.framework:					4.4.0
-	
-# apache commons	
-package;org.apache.commons.lang:				2.4.0
-package;org.apache.commons.lang.text:				2.4.0
-package;org.apache.commons.cli:					1.2.0
-
-# apache ant
-package;org.apache.tools.ant:					1.7.0
-
-package;org.apache.ivy*:					[2.0.0,2.0.0]
-package;org.apache.tools.ant*:					1.7.1
-
-# ganymede
-# package;org.eclipse.core.resources:				3.4.1
-# package;org.eclipse.core.runtime.content:			1.5.4
-# package;org.eclipse.ui:					3.4.1
-# package;org.eclipse.core.runtime.jobs:			3.4.0
-# package;org.eclipse.debug.core:				3.4.0
-# package;org.eclipse.debug.ui:					3.4.2
-# package;org.eclipse.jdt.core:					3.4.2
-# package;org.eclipse.jface.dialogs:				3.4.1
-# package;org.eclipse.jface.preference:				3.4.1
-# package;org.eclipse.jface.resource:				3.4.1
-# package;org.eclipse.jface.util:					3.4.1
-# package;org.eclipse.jface.window:				3.4.1
-# package;org.eclipse.ui.console:					3.3.1
-# package;org.eclipse.ui.dialogs:					3.4.1
-# package;org.eclipse.ui.plugin:					3.4.1
-# package;org.eclipse.core.commands:				3.4.0
-# package;org.eclipse.core.commands.common:			3.4.0
-# package;org.eclipse.core.internal.preferences:			3.2.201
-# package;org.eclipse.draw2d:					3.4.2
-# org.eclipse.jdt
-# package;org.eclipse.jdt.core.compiler:				3.4.2
-# package;org.eclipse.jdt.core.dom:				3.4.2
-# package;org.eclipse.jdt.core.dom.rewrite:			3.4.2
-# package;org.eclipse.jdt.internal.corext.dom:			3.4.2
-# package;org.eclipse.jdt.internal.corext.util:			3.4.2
-# package;org.eclipse.jdt.internal.ui:				3.4.2
-# package;org.eclipse.jdt.internal.ui.propertiesfileeditor:	3.4.2
-# package;org.eclipse.jdt.ui:					3.4.2
-# package;org.eclipse.jdt.ui.text:				3.4.2
-# package;org.eclipse.jdt.ui.text.java:				3.4.2
-# package;org.eclipse.jdt.ui.wizards:				3.4.2
-
-# org.eclipse.jface
-# package;org.eclipse.jface.action:				3.4.1
-# package;org.eclipse.jface.fieldassist:				3.4.1
-# package;org.eclipse.jface.layout:				3.4.1
-# package;org.eclipse.jface.operation:				3.4.1
-# package;org.eclipse.jface.text:					3.4.2
-# package;org.eclipse.jface.text.contentassist:			3.4.2
-# package;org.eclipse.jface.viewers:				3.4.1
-# package;org.eclipse.jface.wizard:				3.4.1
-
-# org.eclipse.ltk
-# package;org.eclipse.ltk.core.refactoring:			3.4.2
-
-# org.eclipse.pde
-# package;org.eclipse.pde.internal.ui.editor:			3.4.0
-# package;org.eclipse.pde.internal.ui.parts:			3.4.0
-
-# org.eclipse.ui
-# package;org.eclipse.ui.actions:					3.4.1
-# package;org.eclipse.ui.cheatsheets:				3.3.101
-# package;org.eclipse.ui.editors.text:				3.4.0
-# package;org.eclipse.ui.forms:					3.3.103
-# package;org.eclipse.ui.forms.editor:				3.3.103
-# package;org.eclipse.ui.forms.events:				3.3.103
-# package;org.eclipse.ui.forms.widgets:				3.3.103
-# package;org.eclipse.ui.handlers:				3.4.1
-# package;org.eclipse.ui.ide:					3.4.2
-# package;org.eclipse.ui.part:					3.4.1
-# package;org.eclipse.ui.progress:				3.4.1
-# package;org.eclipse.ui.texteditor:				3.4.0
-# package;org.eclipse.ui.wizards.newresource:			3.4.2
-
-# org.eclipse.zest
-# package;org.eclipse.zest.core.viewers:				1.0.0
-# package;org.eclipse.zest.core.widgets:				1.0.0
-# package;org.eclipse.zest.layouts:				1.0.0
-# package;org.eclipse.zest.layouts.algorithms:			1.0.0
-
-# galileo
-package;org.eclipse.*:				0.0.0
-
-
-# OSGi framework
-package;org.osgi.framework:					1.4.0
-package;org.osgi.framework.launch:				1.0.0
-package;org.osgi.service.prefs:					1.1.0
-package;org.osgi.service.packageadmin				1.2.0
-package;org.osgi.util.tracker:					1.3.3
-
-# Gogo
-package;org.osgi.service.command:				0.2.0
diff --git a/sigil/bldcommon/updatesite.groovy b/sigil/bldcommon/updatesite.groovy
deleted file mode 100644
index fe0840c..0000000
--- a/sigil/bldcommon/updatesite.groovy
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import java.util.jar.JarFile
-
-def processFeature(file,writer) {
-  def jar = new JarFile(file)
-
-  if (jar.getEntry( "feature.xml" ) != null) {
-    def path = 'features/' + file.getName()
-    def attrs = jar.getManifest().getMainAttributes()
-
-    def id = attrs.getValue('Bundle-SymbolicName')
-    def version = attrs.getValue('Bundle-Version')
-
-    writer.println( '  <feature url="' + path + '" id="' + id + '" version="' + version + '">' )
-    writer.println( '    <category name="Sigil"/>')
-    writer.println( '  </feature>' )
-  }
-
-  jar.close()
-}
-
-def findJars(dir,closure) {
-  dir.eachFileRecurse() { f ->
-    if (f ==~ /.*jar$/) closure( f )
-  }
-}
-
-
-def generateUpdateSite(dir,site) {
-  def writer = new PrintWriter( site )
-  writer.println('<site>')
-
-  findJars( dir, { f -> processFeature( f, writer ) } )
-
-  writer.println('  <category-def name="Sigil" label="Sigil-Core"> ')
-  writer.println('    <description>')
-  writer.println('      Sigil is an SDK for developing OSGi applications')
-  writer.println('    </description>')
-  writer.println('  </category-def>')
-  writer.println('</site>')
-
-  writer.close()
-}
-
-args.each{ ant.echo(message:it) }
-
-def dir = new File( args[0] )
-def site = new File( args[1] )
-
-generateUpdateSite(dir, site)
diff --git a/sigil/build.xml b/sigil/build.xml
deleted file mode 100644
index 3361dd3..0000000
--- a/sigil/build.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="sigil" default="dist" 
-  xmlns:ivy="antlib:org.apache.ivy.ant"
-  xmlns:groovy="antlib:org.codehaus.groovy">
-
-  <import file="bldcommon/common.xml"/>
-
-  <fileset id="my.projects" dir="${basedir}">
-    <exclude name="ivy/resolver/test/**/${build_xml}"/>
-    <exclude name="ivy/resolver/example/**/${build_xml}"/>
-    <exclude name="bldcommon/**/${build_xml}" />
-    <include name="**/${build_xml}"/>
-  </fileset>
-
-  <target name="init">
-    <subant buildpath="bldcommon/prepare" target="resolve" />
-  </target>
-
-  <target name="dist" depends="build, site" />
-
-  <target name="clean" depends="clean-list, clean-site, clean-tmp" />
-
-  <target name="build" depends="init, build-list" />
-
-  <target name="report" depends="report-list" />
-
-  <target name="site" depends="bldcommon.init">
-    <!-- eclipse features -->
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.eclipse.core.feature" revision="latest.integration" inline="true" pattern="${site.dir}/features/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.eclipse.obr.feature" revision="latest.integration" inline="true" pattern="${site.dir}/features/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-
-    <!-- eclipse plugins -->
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.common.core" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.common.junit" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.common.obr" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.common.osgi" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.common.runtime" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.eclipse.core" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.eclipse.help" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.eclipse.obr" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.eclipse.runtime" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.eclipse.search" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.eclipse.ui" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.eclipse.utils" revision="latest.integration" inline="true" pattern="${site.dir}/plugins/[artifact]_${buildVersion}.[ext]" transitive="false"/>
-    <ivy:retrieve organisation="sigil" module="com.springsource.org.apache.commons.lang" revision="2.4.0" inline="true" pattern="${site.dir}/plugins/[artifact]_[revision].[ext]" transitive="false"/>
-
-    <!-- ivy -->
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.ivy.resolver" revision="latest.integration" inline="true" pattern="${site.dir}/ivy/[artifact].[ext]" transitive="false"/>
-
-    <!-- gogo -->
-    <ivy:retrieve organisation="org.apache" module="felix.sigil.gogo.junit" revision="latest.integration" inline="true" pattern="${site.dir}/gogo/[artifact].[ext]" transitive="false"/>
-
-    <groovy:groovy src="bldcommon/updatesite.groovy">
-      <arg value="${site.dir}/features"/>
-      <arg value="${site.dir}/site.xml" />
-    </groovy:groovy>
-  </target>
-
-  <target name="clean-site">
-    <delete dir="${site.dir}" />
-  </target>
-
-  <target name="clean-tmp">
-    <echo>${cache.dir}</echo>
-    <delete includeemptydirs="true">
-     <fileset dir="${cache.dir}" includes="all/org.apache-felix.sigil*"/>
-     <fileset dir="${cache.dir}" includes="all/org.apache/felix.sigil*/**"/>
-     <fileset dir="${cache.dir}" includes="all/resolved-org.apache-felix.sigil*"/>
-    </delete>
-    <delete includeemptydirs="true">
-     <dirset dir="${cache.dir}">
-       <include name="all/org.apache/felix.sigil*"/>
-     </dirset>
-    </delete>
-  </target>
-</project>
diff --git a/sigil/common/build.xml b/sigil/common/build.xml
deleted file mode 100644
index ca46688..0000000
--- a/sigil/common/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="common" default="build-list">
-  <import file="../bldcommon/common.xml"/>
-</project>
diff --git a/sigil/common/core.tests/.classpath b/sigil/common/core.tests/.classpath
deleted file mode 100644
index c9ffd60..0000000
--- a/sigil/common/core.tests/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/common/core.tests/.project b/sigil/common/core.tests/.project
deleted file mode 100644
index 60d4d6d..0000000
--- a/sigil/common/core.tests/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.common.core.tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/common/core.tests/.settings/org.eclipse.jdt.core.prefs b/sigil/common/core.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index cf9d68d..0000000
--- a/sigil/common/core.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,258 +0,0 @@
-#Thu Sep 17 16:06:48 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/common/core.tests/.settings/org.eclipse.jdt.ui.prefs b/sigil/common/core.tests/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index cf4e646..0000000
--- a/sigil/common/core.tests/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:06:48 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/common/core.tests/build.xml b/sigil/common/core.tests/build.xml
deleted file mode 100644
index c340ddb..0000000
--- a/sigil/common/core.tests/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="core.tests" default="build">
-      <import file="../build.xml"/>
-</project>
diff --git a/sigil/common/core.tests/ivy.xml b/sigil/common/core.tests/ivy.xml
deleted file mode 100644
index 1b2b493..0000000
--- a/sigil/common/core.tests/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.common.core.tests"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.common.core.tests" />
-   </publications>
-</ivy-module>
diff --git a/sigil/common/core.tests/sigil.properties b/sigil/common/core.tests/sigil.properties
deleted file mode 100644
index 52d143a..0000000
--- a/sigil/common/core.tests/sigil.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--bundles: \
-	org.apache.felix.sigil.common.core.tests, \
-
--sourcedirs: \
-	src, \
-
--fragment: \
-	org.apache.felix.sigil.common.core, \
-
--imports: \
-	junit.framework, \
-	org.apache.felix.sigil.common.osgi, \
-	org.osgi.framework, \
-
-# end
diff --git a/sigil/common/core.tests/src/org/apache/felix/sigil/common/core/BundleModelElementTest.java b/sigil/common/core.tests/src/org/apache/felix/sigil/common/core/BundleModelElementTest.java
deleted file mode 100644
index 6aac51c..0000000
--- a/sigil/common/core.tests/src/org/apache/felix/sigil/common/core/BundleModelElementTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core;
-
-import java.util.Arrays;
-
-import org.apache.felix.sigil.common.core.internal.model.osgi.BundleModelElement;
-import org.apache.felix.sigil.common.core.internal.model.osgi.PackageImport;
-import org.apache.felix.sigil.common.core.internal.model.osgi.RequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-
-import junit.framework.TestCase;
-
-public class BundleModelElementTest extends TestCase
-{
-
-    public BundleModelElementTest(String name)
-    {
-        super(name);
-    }
-
-    public void testAddRequires()
-    {
-        BundleModelElement element = new BundleModelElement();
-        checkRequires(element);
-    }
-
-    public void testAddImports()
-    {
-        BundleModelElement element = new BundleModelElement();
-        checkImports(element);
-    }
-
-    public void testAddImportsAndRequires()
-    {
-        BundleModelElement element = new BundleModelElement();
-        checkImports(element);
-        checkRequires(element);
-
-        element = new BundleModelElement();
-        checkRequires(element);
-        checkImports(element);
-    }
-
-    private void checkImports(BundleModelElement element)
-    {
-        PackageImport foo = new PackageImport();
-        foo.setPackageName("foo");
-        foo.setVersions(VersionRange.parseVersionRange("1.0.0"));
-        PackageImport bar = new PackageImport();
-        bar.setPackageName("bar");
-        bar.setVersions(VersionRange.parseVersionRange("[2.2.2, 3.3.3]"));
-        PackageImport baz = new PackageImport();
-        baz.setPackageName("baz");
-        baz.setVersions(VersionRange.parseVersionRange("[3.0.0, 4.0.0)"));
-
-        element.addChild(foo.clone());
-        element.addChild(bar.clone());
-        element.addChild(baz.clone());
-
-        assertTrue(Arrays.asList(element.children()).contains(foo));
-        assertTrue(Arrays.asList(element.children()).contains(bar));
-        assertTrue(Arrays.asList(element.children()).contains(baz));
-    }
-
-    private void checkRequires(BundleModelElement element)
-    {
-        RequiredBundle foo = new RequiredBundle();
-        foo.setSymbolicName("foo");
-        foo.setVersions(VersionRange.parseVersionRange("1.0.0"));
-        RequiredBundle bar = new RequiredBundle();
-        bar.setSymbolicName("bar");
-        bar.setVersions(VersionRange.parseVersionRange("[2.2.2, 3.3.3]"));
-        RequiredBundle baz = new RequiredBundle();
-        baz.setSymbolicName("baz");
-        baz.setVersions(VersionRange.parseVersionRange("[3.0.0, 4.0.0)"));
-
-        element.addChild(foo.clone());
-        element.addChild(bar.clone());
-        element.addChild(baz.clone());
-
-        assertTrue(Arrays.asList(element.children()).contains(foo));
-        assertTrue(Arrays.asList(element.children()).contains(bar));
-        assertTrue(Arrays.asList(element.children()).contains(baz));
-    }
-}
diff --git a/sigil/common/core.tests/src/org/apache/felix/sigil/common/core/ConfigTest.java b/sigil/common/core.tests/src/org/apache/felix/sigil/common/core/ConfigTest.java
deleted file mode 100644
index 4b196b3..0000000
--- a/sigil/common/core.tests/src/org/apache/felix/sigil/common/core/ConfigTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.Collection;
-
-import junit.framework.TestCase;
-
-import org.apache.felix.sigil.common.config.BldFactory;
-import org.apache.felix.sigil.common.config.IBldProject;
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.common.core.internal.model.osgi.PackageImport;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-
-public class ConfigTest extends TestCase
-{
-
-    static final URI base = URI.create("test/ConfigTest/sigil.properties");
-
-    static
-    {
-        System.setProperty("bar.version", "2.0.0");
-    }
-
-    public ConfigTest(String name)
-    {
-        super(name);
-    }
-
-    public void testSimple() throws IOException
-    {
-        IBldProject project = BldFactory.getProject(base.resolve("test1.properties"));
-
-        ISigilBundle bundle = project.getDefaultBundle();
-        IBundleModelElement info = bundle.getBundleInfo();
-
-        PackageImport foo = new PackageImport();
-        foo.setPackageName("foo");
-        foo.setVersions(VersionRange.parseVersionRange("1.0.0"));
-        PackageImport bar = new PackageImport();
-        bar.setPackageName("bar");
-        bar.setVersions(VersionRange.parseVersionRange("[2.2.2, 3.3.3]"));
-        PackageImport baz = new PackageImport();
-        baz.setPackageName("baz");
-        baz.setVersions(VersionRange.parseVersionRange("[3.0.0, 4.0.0)"));
-
-        Collection<IPackageImport> imports = info.getImports();
-
-        assertTrue(foo.toString(), imports.contains(foo));
-        assertTrue(bar.toString(), imports.contains(bar));
-        assertTrue(baz.toString(), imports.contains(baz));
-        //IBundleModelElement requirements = project.getRequirements();
-    }
-
-    public void testInherited() throws IOException
-    {
-        IBldProject project = BldFactory.getProject(base.resolve("inheritance/foo/sigil.properties"));
-
-        ISigilBundle bundle = project.getDefaultBundle();
-        IBundleModelElement info = bundle.getBundleInfo();
-
-        Collection<IPackageImport> imports = info.getImports();
-        assertEquals(1, imports.size());
-        IPackageImport i = imports.iterator().next();
-        assertEquals("org.bar", i.getPackageName());
-        assertEquals(VersionRange.parseVersionRange("2.0.0"), i.getVersions());
-
-        //        project = BldFactory.getProject( base.resolve( "inheritance/foo/sigil.properties" ), true );
-        //
-        //        bundle = project.getDefaultBundle();
-        //        info = bundle.getBundleInfo();
-        //
-        //        imports = info.getImports();
-        //        assertEquals( 1, imports.size() );
-        //        i = imports.iterator().next();
-        //        assertEquals( "org.bar", i.getPackageName() );
-        //        assertEquals( VersionRange.parseVersionRange("2.0.0"), i.getVersions() );
-    }
-
-    public void testDefinition() throws IOException
-    {
-        IRepositoryConfig project = BldFactory.getConfig(base.resolve("repository/foo/sigil.properties"));
-
-        URI def = project.getRepositoryDefinition("foo");
-        assertNotNull(def);
-        assertTrue(def.toString().endsWith("repository/sigil-defaults.properties"));
-        
-        def = project.getRepositoryDefinition("baz");
-        assertNotNull(def);
-        assertTrue(def.toString().endsWith("repository/foo/sigil.properties"));
-    }
-
-}
diff --git a/sigil/common/core.tests/src/org/apache/felix/sigil/common/core/internal/model/osgi/PackageExportTest.java b/sigil/common/core.tests/src/org/apache/felix/sigil/common/core/internal/model/osgi/PackageExportTest.java
deleted file mode 100644
index df8a908..0000000
--- a/sigil/common/core.tests/src/org/apache/felix/sigil/common/core/internal/model/osgi/PackageExportTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.common.core.internal.model.osgi;
-
-import org.apache.felix.sigil.common.core.internal.model.osgi.PackageExport;
-import org.osgi.framework.Version;
-
-import junit.framework.TestCase;
-
-public class PackageExportTest extends TestCase
-{
-    public PackageExportTest(String name)
-    {
-        super(name);
-    }
-
-    public void testEquals()
-    {
-        PackageExport p1 = new PackageExport();
-        p1.setPackageName("foo");
-        p1.setVersion(Version.parseVersion("1.0.0"));
-
-        PackageExport p2 = new PackageExport();
-        p2.setPackageName("foo");
-        p2.setVersion(Version.parseVersion("1.0.0"));
-
-        assertTrue(p1.equals(p2));
-        assertTrue(p2.equals(p1));
-
-        PackageExport p3 = new PackageExport();
-        p3.setPackageName("foo");
-
-        assertFalse(p1.equals(p3));
-        assertFalse(p3.equals(p1));
-
-        PackageExport p4 = new PackageExport();
-        p4.setVersion(Version.parseVersion("1.0.0"));
-
-        assertFalse(p1.equals(p4));
-        assertFalse(p4.equals(p1));
-
-        PackageExport p5 = new PackageExport();
-        assertFalse(p1.equals(p5));
-        assertFalse(p5.equals(p1));
-
-    }
-}
diff --git a/sigil/common/core.tests/test/ConfigTest/inheritance/foo/sigil.properties b/sigil/common/core.tests/test/ConfigTest/inheritance/foo/sigil.properties
deleted file mode 100644
index b840da7..0000000
--- a/sigil/common/core.tests/test/ConfigTest/inheritance/foo/sigil.properties
+++ /dev/null
@@ -1,2 +0,0 @@
--bundles: org.foo
--imports: org.bar
\ No newline at end of file
diff --git a/sigil/common/core.tests/test/ConfigTest/inheritance/sigil-defaults.properties b/sigil/common/core.tests/test/ConfigTest/inheritance/sigil-defaults.properties
deleted file mode 100644
index 1a0d156..0000000
--- a/sigil/common/core.tests/test/ConfigTest/inheritance/sigil-defaults.properties
+++ /dev/null
@@ -1 +0,0 @@
-package;org.bar*:	${bar.version:-1.0.0}
\ No newline at end of file
diff --git a/sigil/common/core.tests/test/ConfigTest/repository/foo/sigil.properties b/sigil/common/core.tests/test/ConfigTest/repository/foo/sigil.properties
deleted file mode 100644
index 08cd12c..0000000
--- a/sigil/common/core.tests/test/ConfigTest/repository/foo/sigil.properties
+++ /dev/null
@@ -1,6 +0,0 @@
--bundles: org.foo
--imports: org.bar
-
--repositoryPath: foo, bar, baz
-
-baz;provider: system
\ No newline at end of file
diff --git a/sigil/common/core.tests/test/ConfigTest/repository/sigil-defaults.properties b/sigil/common/core.tests/test/ConfigTest/repository/sigil-defaults.properties
deleted file mode 100644
index 612bebe..0000000
--- a/sigil/common/core.tests/test/ConfigTest/repository/sigil-defaults.properties
+++ /dev/null
@@ -1,4 +0,0 @@
--repositories: foo, bar, baz
-
-foo;provider: system
-bar;provider: system
\ No newline at end of file
diff --git a/sigil/common/core.tests/test/ConfigTest/test1.properties b/sigil/common/core.tests/test/ConfigTest/test1.properties
deleted file mode 100644
index 043837f..0000000
--- a/sigil/common/core.tests/test/ConfigTest/test1.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-
-# test1
-
--bundles: default
-
--imports: \
-  foo;version=1.0, \
-  bar;version="[2.2.2,3.3.3]", \
-  baz;version="[3.0.0,4.0.0)", \
-
diff --git a/sigil/common/core/.classpath b/sigil/common/core/.classpath
deleted file mode 100644
index c9ffd60..0000000
--- a/sigil/common/core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/common/core/.project b/sigil/common/core/.project
deleted file mode 100644
index b7701c6..0000000
--- a/sigil/common/core/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.common.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/common/core/.settings/org.eclipse.jdt.core.prefs b/sigil/common/core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index afe2658..0000000
--- a/sigil/common/core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,258 +0,0 @@
-#Thu Sep 17 16:06:31 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/common/core/.settings/org.eclipse.jdt.ui.prefs b/sigil/common/core/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 9ab01e0..0000000
--- a/sigil/common/core/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:06:31 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/common/core/DEPENDENCIES b/sigil/common/core/DEPENDENCIES
deleted file mode 100644
index dc158c9..0000000
--- a/sigil/common/core/DEPENDENCIES
+++ /dev/null
@@ -1,28 +0,0 @@
-Apache Felix Sigil Common Core
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-This product includes software developed by Peter Kriens
-(http://www.aqute.biz/Code/Bnd)
-Copyright 2006-2009 aQute, All rights reserved
-Licensed under the Apache License 2.0.
-
-II. Used Third-Party Software
-
-This product uses software developed by Peter Kriens
-(http://www.aqute.biz/Code/Bnd)
-Copyright 2006-2009 aQute, All rights reserved
-Licensed under the Apache License 2.0.
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
diff --git a/sigil/common/core/NOTICE b/sigil/common/core/NOTICE
deleted file mode 100644
index caf3ce7..0000000
--- a/sigil/common/core/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Common Core
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/common/core/build.xml b/sigil/common/core/build.xml
deleted file mode 100644
index ab67875..0000000
--- a/sigil/common/core/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="common.core" default="build">
-      <import file="../build.xml"/>
-</project>
diff --git a/sigil/common/core/ivy.xml b/sigil/common/core/ivy.xml
deleted file mode 100644
index 6e78d8b..0000000
--- a/sigil/common/core/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.common.core"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.common.core" />
-   </publications>
-</ivy-module>
diff --git a/sigil/common/core/profiles/jvm-packages.properties b/sigil/common/core/profiles/jvm-packages.properties
deleted file mode 100644
index 6fdbb8f..0000000
--- a/sigil/common/core/profiles/jvm-packages.properties
+++ /dev/null
@@ -1,450 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-#
-# Java platform package export properties.
-#
-jre-1.3= \
- javax.accessibility; \
- javax.naming; \
- javax.naming.directory; \
- javax.naming.event; \
- javax.naming.ldap; \
- javax.naming.spi; \
- javax.rmi; \
- javax.rmi.CORBA; \
- javax.sound.midi; \
- javax.sound.midi.spi; \
- javax.sound.sampled; \
- javax.sound.sampled.spi; \
- javax.swing; \
- javax.swing.border; \
- javax.swing.colorchooser; \
- javax.swing.event; \
- javax.swing.filechooser; \
- javax.swing.plaf; \
- javax.swing.plaf.basic; \
- javax.swing.plaf.metal; \
- javax.swing.plaf.multi; \
- javax.swing.table; \
- javax.swing.text; \
- javax.swing.text.html; \
- javax.swing.text.html.parser; \
- javax.swing.text.rtf; \
- javax.swing.tree; \
- javax.swing.undo; \
- javax.transaction; \
- org.omg.CORBA; \
- org.omg.CORBA_2_3; \
- org.omg.CORBA_2_3.portable; \
- org.omg.CORBA.DynAnyPackage; \
- org.omg.CORBA.ORBPackage; \
- org.omg.CORBA.portable; \
- org.omg.CORBA.TypeCodePackage; \
- org.omg.CosNaming; \
- org.omg.CosNaming.NamingContextPackage; \
- org.omg.SendingContext; \
- org.omg.stub.java.rmi; \
- version="0.0.0.1_003_J2SE"
-
-jre-1.4= \
- javax.accessibility; \
- javax.crypto; \
- javax.crypto.interfaces; \
- javax.crypto.spec; \
- javax.imageio; \
- javax.imageio.event; \
- javax.imageio.metadata; \
- javax.imageio.plugins.jpeg; \
- javax.imageio.spi; \
- javax.imageio.stream; \
- javax.naming; \
- javax.naming.directory; \
- javax.naming.event; \
- javax.naming.ldap; \
- javax.naming.spi; \
- javax.net; \
- javax.net.ssl; \
- javax.print; \
- javax.print.attribute; \
- javax.print.attribute.standard; \
- javax.print.event; \
- javax.rmi; \
- javax.rmi.CORBA; \
- javax.security.auth; \
- javax.security.auth.callback; \
- javax.security.auth.kerberos; \
- javax.security.auth.login; \
- javax.security.auth.spi; \
- javax.security.auth.x500; \
- javax.security.cert; \
- javax.sound.midi; \
- javax.sound.midi.spi; \
- javax.sound.sampled; \
- javax.sound.sampled.spi; \
- javax.sql; \
- javax.swing; \
- javax.swing.border; \
- javax.swing.colorchooser; \
- javax.swing.event; \
- javax.swing.filechooser; \
- javax.swing.plaf; \
- javax.swing.plaf.basic; \
- javax.swing.plaf.metal; \
- javax.swing.plaf.multi; \
- javax.swing.table; \
- javax.swing.text; \
- javax.swing.text.html; \
- javax.swing.text.html.parser; \
- javax.swing.text.rtf; \
- javax.swing.tree; \
- javax.swing.undo; \
- javax.transaction; \
- javax.transaction.xa; \
- javax.xml.parsers; \
- javax.xml.transform; \
- javax.xml.transform.dom; \
- javax.xml.transform.sax; \
- javax.xml.transform.stream; \
- org.ietf.jgss; \
- org.omg.CORBA; \
- org.omg.CORBA_2_3; \
- org.omg.CORBA_2_3.portable; \
- org.omg.CORBA.DynAnyPackage; \
- org.omg.CORBA.ORBPackage; \
- org.omg.CORBA.portable; \
- org.omg.CORBA.TypeCodePackage; \
- org.omg.CosNaming; \
- org.omg.CosNaming.NamingContextExtPackage; \
- org.omg.CosNaming.NamingContextPackage; \
- org.omg.Dynamic; \
- org.omg.DynamicAny; \
- org.omg.DynamicAny.DynAnyFactoryPackage; \
- org.omg.DynamicAny.DynAnyPackage; \
- org.omg.IOP; \
- org.omg.IOP.CodecFactoryPackage; \
- org.omg.IOP.CodecPackage; \
- org.omg.Messaging; \
- org.omg.PortableInterceptor; \
- org.omg.PortableInterceptor.ORBInitInfoPackage; \
- org.omg.PortableServer; \
- org.omg.PortableServer.CurrentPackage; \
- org.omg.PortableServer.POAManagerPackage; \
- org.omg.PortableServer.POAPackage; \
- org.omg.PortableServer.portable; \
- org.omg.PortableServer.ServantLocatorPackage; \
- org.omg.SendingContext; \
- org.omg.stub.java.rmi; \
- org.w3c.dom; \
- org.w3c.dom.css; \
- org.w3c.dom.events; \
- org.w3c.dom.html; \
- org.w3c.dom.stylesheets; \
- org.w3c.dom.traversal; \
- org.w3c.dom.views; \
- org.xml.sax; \
- org.xml.sax.ext; \
- org.xml.sax.helpers; \
- version="0.0.0.1_004_J2SE"
-
-jre-1.5=\
- javax.accessibility; \
- javax.activity; \
- javax.crypto; \
- javax.crypto.interfaces; \
- javax.crypto.spec; \
- javax.imageio; \
- javax.imageio.event; \
- javax.imageio.metadata; \
- javax.imageio.plugins.bmp; \
- javax.imageio.plugins.jpeg; \
- javax.imageio.spi; \
- javax.imageio.stream; \
- javax.management; \
- javax.management.loading; \
- javax.management.modelmbean; \
- javax.management.monitor; \
- javax.management.openmbean; \
- javax.management.relation; \
- javax.management.remote; \
- javax.management.remote.rmi; \
- javax.management.timer; \
- javax.naming; \
- javax.naming.directory; \
- javax.naming.event; \
- javax.naming.ldap; \
- javax.naming.spi; \
- javax.net; \
- javax.net.ssl; \
- javax.print; \
- javax.print.attribute; \
- javax.print.attribute.standard; \
- javax.print.event; \
- javax.rmi; \
- javax.rmi.CORBA; \
- javax.rmi.ssl; \
- javax.security.auth; \
- javax.security.auth.callback; \
- javax.security.auth.kerberos; \
- javax.security.auth.login; \
- javax.security.auth.spi; \
- javax.security.auth.x500; \
- javax.security.cert; \
- javax.security.sasl; \
- javax.sound.midi; \
- javax.sound.midi.spi; \
- javax.sound.sampled; \
- javax.sound.sampled.spi; \
- javax.sql; \
- javax.sql.rowset; \
- javax.sql.rowset.serial; \
- javax.sql.rowset.spi; \
- javax.swing; \
- javax.swing.border; \
- javax.swing.colorchooser; \
- javax.swing.event; \
- javax.swing.filechooser; \
- javax.swing.plaf; \
- javax.swing.plaf.basic; \
- javax.swing.plaf.metal; \
- javax.swing.plaf.multi; \
- javax.swing.plaf.synth; \
- javax.swing.table; \
- javax.swing.text; \
- javax.swing.text.html; \
- javax.swing.text.html.parser; \
- javax.swing.text.rtf; \
- javax.swing.tree; \
- javax.swing.undo; \
- javax.transaction; \
- javax.transaction.xa; \
- javax.xml; \
- javax.xml.datatype; \
- javax.xml.namespace; \
- javax.xml.parsers; \
- javax.xml.transform; \
- javax.xml.transform.dom; \
- javax.xml.transform.sax; \
- javax.xml.transform.stream; \
- javax.xml.validation; \
- javax.xml.xpath; \
- org.ietf.jgss; \
- org.omg.CORBA; \
- org.omg.CORBA_2_3; \
- org.omg.CORBA_2_3.portable; \
- org.omg.CORBA.DynAnyPackage; \
- org.omg.CORBA.ORBPackage; \
- org.omg.CORBA.portable; \
- org.omg.CORBA.TypeCodePackage; \
- org.omg.CosNaming; \
- org.omg.CosNaming.NamingContextExtPackage; \
- org.omg.CosNaming.NamingContextPackage; \
- org.omg.Dynamic; \
- org.omg.DynamicAny; \
- org.omg.DynamicAny.DynAnyFactoryPackage; \
- org.omg.DynamicAny.DynAnyPackage; \
- org.omg.IOP; \
- org.omg.IOP.CodecFactoryPackage; \
- org.omg.IOP.CodecPackage; \
- org.omg.Messaging; \
- org.omg.PortableInterceptor; \
- org.omg.PortableInterceptor.ORBInitInfoPackage; \
- org.omg.PortableServer; \
- org.omg.PortableServer.CurrentPackage; \
- org.omg.PortableServer.POAManagerPackage; \
- org.omg.PortableServer.POAPackage; \
- org.omg.PortableServer.portable; \
- org.omg.PortableServer.ServantLocatorPackage; \
- org.omg.SendingContext; \
- org.omg.stub.java.rmi; \
- org.omg.stub.javax.management.remote.rmi; \
- org.w3c.dom; \
- org.w3c.dom.bootstrap; \
- org.w3c.dom.css; \
- org.w3c.dom.events; \
- org.w3c.dom.html; \
- org.w3c.dom.ls; \
- org.w3c.dom.ranges; \
- org.w3c.dom.stylesheets; \
- org.w3c.dom.traversal; \
- org.w3c.dom.views; \
- org.xml.sax; \
- org.xml.sax.ext; \
- org.xml.sax.helpers; \
- version="0.0.0.1_005_J2SE"
-
-jre-1.6=\
- javax.accessibility; \
- javax.activation; \
- javax.activity; \
- javax.annotation; \
- javax.annotation.processing; \
- javax.crypto; \
- javax.crypto.interfaces; \
- javax.crypto.spec; \
- javax.imageio; \
- javax.imageio.event; \
- javax.imageio.metadata; \
- javax.imageio.plugins.bmp; \
- javax.imageio.plugins.jpeg; \
- javax.imageio.spi; \
- javax.imageio.stream; \
- javax.jws; \
- javax.jws.soap; \
- javax.lang.model; \
- javax.lang.model.element; \
- javax.lang.model.type; \
- javax.lang.model.util; \
- javax.management; \
- javax.management.loading; \
- javax.management.modelmbean; \
- javax.management.monitor; \
- javax.management.openmbean; \
- javax.management.relation; \
- javax.management.remote; \
- javax.management.remote.rmi; \
- javax.management.timer; \
- javax.naming; \
- javax.naming.directory; \
- javax.naming.event; \
- javax.naming.ldap; \
- javax.naming.spi; \
- javax.net; \
- javax.net.ssl; \
- javax.print; \
- javax.print.attribute; \
- javax.print.attribute.standard; \
- javax.print.event; \
- javax.rmi; \
- javax.rmi.CORBA; \
- javax.rmi.ssl; \
- javax.script; \
- javax.security.auth; \
- javax.security.auth.callback; \
- javax.security.auth.kerberos; \
- javax.security.auth.login; \
- javax.security.auth.spi; \
- javax.security.auth.x500; \
- javax.security.cert; \
- javax.security.sasl; \
- javax.sound.midi; \
- javax.sound.midi.spi; \
- javax.sound.sampled; \
- javax.sound.sampled.spi; \
- javax.sql; \
- javax.sql.rowset; \
- javax.sql.rowset.serial; \
- javax.sql.rowset.spi; \
- javax.swing; \
- javax.swing.border; \
- javax.swing.colorchooser; \
- javax.swing.event; \
- javax.swing.filechooser; \
- javax.swing.plaf; \
- javax.swing.plaf.basic; \
- javax.swing.plaf.metal; \
- javax.swing.plaf.multi; \
- javax.swing.plaf.synth; \
- javax.swing.table; \
- javax.swing.text; \
- javax.swing.text.html; \
- javax.swing.text.html.parser; \
- javax.swing.text.rtf; \
- javax.swing.tree; \
- javax.swing.undo; \
- javax.tools; \
- javax.transaction; \
- javax.transaction.xa; \
- javax.xml; \
- javax.xml.bind; \
- javax.xml.bind.annotation; \
- javax.xml.bind.annotation.adapters; \
- javax.xml.bind.attachment; \
- javax.xml.bind.helpers; \
- javax.xml.bind.util; \
- javax.xml.crypto; \
- javax.xml.crypto.dom; \
- javax.xml.crypto.dsig; \
- javax.xml.crypto.dsig.dom; \
- javax.xml.crypto.dsig.keyinfo; \
- javax.xml.crypto.dsig.spec; \
- javax.xml.datatype; \
- javax.xml.namespace; \
- javax.xml.parsers; \
- javax.xml.soap; \
- javax.xml.stream; \
- javax.xml.stream.events; \
- javax.xml.stream.util; \
- javax.xml.transform; \
- javax.xml.transform.dom; \
- javax.xml.transform.sax; \
- javax.xml.transform.stax; \
- javax.xml.transform.stream; \
- javax.xml.validation; \
- javax.xml.ws; \
- javax.xml.ws.handler; \
- javax.xml.ws.handler.soap; \
- javax.xml.ws.http; \
- javax.xml.ws.soap; \
- javax.xml.ws.spi; \
- javax.xml.ws.wsaddressing; \
- javax.xml.xpath; \
- org.ietf.jgss; \
- org.omg.CORBA; \
- org.omg.CORBA_2_3; \
- org.omg.CORBA_2_3.portable; \
- org.omg.CORBA.DynAnyPackage; \
- org.omg.CORBA.ORBPackage; \
- org.omg.CORBA.portable; \
- org.omg.CORBA.TypeCodePackage; \
- org.omg.CosNaming; \
- org.omg.CosNaming.NamingContextExtPackage; \
- org.omg.CosNaming.NamingContextPackage; \
- org.omg.Dynamic; \
- org.omg.DynamicAny; \
- org.omg.DynamicAny.DynAnyFactoryPackage; \
- org.omg.DynamicAny.DynAnyPackage; \
- org.omg.IOP; \
- org.omg.IOP.CodecFactoryPackage; \
- org.omg.IOP.CodecPackage; \
- org.omg.Messaging; \
- org.omg.PortableInterceptor; \
- org.omg.PortableInterceptor.ORBInitInfoPackage; \
- org.omg.PortableServer; \
- org.omg.PortableServer.CurrentPackage; \
- org.omg.PortableServer.POAManagerPackage; \
- org.omg.PortableServer.POAPackage; \
- org.omg.PortableServer.portable; \
- org.omg.PortableServer.ServantLocatorPackage; \
- org.omg.SendingContext; \
- org.omg.stub.java.rmi; \
- org.omg.stub.javax.management.remote.rmi; \
- org.w3c.dom; \
- org.w3c.dom.bootstrap; \
- org.w3c.dom.css; \
- org.w3c.dom.events; \
- org.w3c.dom.html; \
- org.w3c.dom.ls; \
- org.w3c.dom.ranges; \
- org.w3c.dom.stylesheets; \
- org.w3c.dom.traversal; \
- org.w3c.dom.views; \
- org.w3c.dom.xpath; \
- org.xml.sax; \
- org.xml.sax.ext; \
- org.xml.sax.helpers; \
- version="0.0.0.1_006_JavaSE"
diff --git a/sigil/common/core/sigil.properties b/sigil/common/core/sigil.properties
deleted file mode 100644
index fce4269..0000000
--- a/sigil/common/core/sigil.properties
+++ /dev/null
@@ -1,57 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--activator: org.apache.felix.sigil.common.core.BldCore
-
--bundles: \
-	org.apache.felix.sigil.common.core, \
-
--contents: \
-	aQute.bnd*, \
-	aQute.lib*, \
-	aQute.libg*, \
-	aQute.service.scripting*, \
-	org.apache.felix.sigil.common.bnd*, \
-	org.apache.felix.sigil.common.config*, \
-	org.apache.felix.sigil.common.core*, \
-	org.apache.felix.sigil.common.model*, \
-	org.apache.felix.sigil.common.repository*, \
-	org.apache.felix.sigil.common.util*, \
-	org.apache.felix.sigil.common.progress*, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-	profiles/jvm-packages.properties, \
-
--exports: \
-	org.apache.felix.sigil.common.bnd, \
-	org.apache.felix.sigil.common.config, \
-	org.apache.felix.sigil.common.core, \
-	org.apache.felix.sigil.common.core.licence, \
-	org.apache.felix.sigil.common.core.repository, \
-	org.apache.felix.sigil.common.model, \
-	org.apache.felix.sigil.common.model.eclipse, \
-	org.apache.felix.sigil.common.model.osgi, \
-	org.apache.felix.sigil.common.progress, \
-	org.apache.felix.sigil.common.repository, \
-	org.apache.felix.sigil.common.util, \
-
--imports: \
-	aQute.lib.osgi;resolve=compile, \
-	org.apache.felix.sigil.common.bnd, \
-	org.apache.felix.sigil.common.config, \
-	org.apache.felix.sigil.common.core, \
-	org.apache.felix.sigil.common.core.licence, \
-	org.apache.felix.sigil.common.core.repository, \
-	org.apache.felix.sigil.common.model, \
-	org.apache.felix.sigil.common.model.eclipse, \
-	org.apache.felix.sigil.common.model.osgi, \
-	org.apache.felix.sigil.common.osgi, \
-	org.apache.felix.sigil.common.repository, \
-	org.apache.felix.sigil.common.util, \
-	org.osgi.framework, \
-
-header;Bundle-ActivationPolicy: lazy
-
-# end
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/bnd/BundleBuilder.java b/sigil/common/core/src/org/apache/felix/sigil/common/bnd/BundleBuilder.java
deleted file mode 100644
index 0e7cd93..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/bnd/BundleBuilder.java
+++ /dev/null
@@ -1,758 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.bnd;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.jar.Attributes;
-
-import org.apache.felix.sigil.common.config.BldAttr;
-import org.apache.felix.sigil.common.config.IBldProject;
-import org.apache.felix.sigil.common.config.Resource;
-import org.apache.felix.sigil.common.config.IBldProject.IBldBundle;
-import org.apache.felix.sigil.common.core.repository.SystemRepositoryProvider;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.osgi.framework.Version;
-
-import aQute.lib.osgi.Builder;
-import aQute.lib.osgi.Constants;
-import aQute.lib.osgi.Jar;
-import aQute.lib.osgi.Processor;
-
-public class BundleBuilder
-{
-    private IBldProject project;
-    private File[] classpath;
-    private String destPattern;
-    private Properties env;
-    private List<String> errors = new ArrayList<String>();
-    private List<String> warnings = new ArrayList<String>();
-
-    private Set<String> unused = new HashSet<String>();
-    private String lastBundle = null;
-
-    private boolean addMissingImports;
-    private boolean omitUnusedImports;
-    private Set<String> systemPkgs;
-
-    public interface Log
-    {
-        void warn(String msg);
-
-        void verbose(String msg);
-    }
-
-    /**
-     * creates a BundleBuilder.
-     * 
-     * @param classpath
-     * @param destPattern
-     *            ivy-like pattern: PATH/[name]-[revision].[ext].
-     *            [id] is replaced with the bundle id.
-     *            [name] is replaced with the Bundle-SymbolicName
-     *            [revision] is replaced with the Bundle-Version
-     *            [ext] is replaced with "jar".
-     * @param hashtable
-     */
-    public BundleBuilder(IBldProject project, File[] classpath, String destPattern, Properties env)
-    {
-        this.project = project;
-        this.classpath = classpath;
-        this.destPattern = destPattern;
-        this.env = env;
-
-        Properties options = project.getOptions();
-
-        addMissingImports = options.containsKey(BldAttr.OPTION_ADD_IMPORTS)
-            && Boolean.parseBoolean(options.getProperty(BldAttr.OPTION_ADD_IMPORTS));
-        omitUnusedImports = options.containsKey(BldAttr.OPTION_OMIT_IMPORTS)
-            && Boolean.parseBoolean(options.getProperty(BldAttr.OPTION_OMIT_IMPORTS));
-
-        for (IBldBundle b : project.getBundles())
-        {
-            lastBundle = b.getId();
-            for (IPackageImport import1 : b.getImports())
-            {
-                if (import1.getOSGiImport().equals(IPackageImport.OSGiImport.AUTO))
-                {
-                    unused.add(import1.getPackageName());
-                }
-            }
-        }
-
-        try
-        {
-            systemPkgs = new TreeSet<String>();
-            String pkgs = SystemRepositoryProvider.readSystemPackages(null);
-            for (String pkg : pkgs.split(",\\s*"))
-            {
-                systemPkgs.add(pkg);
-            }
-        }
-        catch (IOException e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    public List<String> errors()
-    {
-        return errors;
-    }
-
-    public List<String> warnings()
-    {
-        return warnings;
-    }
-
-    @SuppressWarnings("unchecked")
-    private void convertErrors(String prefix, List messages)
-    {
-        // TODO: make error mapping more generic
-        final String jarEmpty = "The JAR is empty";
-
-        for (Object omsg : messages)
-        {
-            if (jarEmpty.equals(omsg))
-                warnings.add(prefix + omsg);
-            else
-                errors.add(prefix + omsg);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private void convertWarnings(String prefix, List messages)
-    {
-        for (Object omsg : messages)
-        {
-            warnings.add(prefix + omsg);
-        }
-    }
-
-    public boolean createBundle(IBldBundle bundle, boolean force, Log log)
-        throws Exception
-    {
-        int bracket = destPattern.indexOf('[');
-        if (bracket < 0)
-        {
-            throw new Exception("destPattern MUST contain [id] or [name].");
-        }
-
-        String dest = destPattern.replaceFirst("\\[id\\]", bundle.getId());
-        dest = dest.replaceFirst("\\[name\\]", bundle.getSymbolicName());
-        dest = dest.replaceFirst("\\[revision\\]", bundle.getVersion());
-        dest = dest.replaceFirst("\\[ext\\]", "jar");
-
-        bracket = dest.indexOf('[');
-        if (bracket >= 0)
-        {
-            String token = dest.substring(bracket);
-            throw new Exception("destPattern: expected [id],  [name] or [revision]: "
-                + token);
-        }
-
-        errors.clear();
-        warnings.clear();
-
-        Properties spec = getBndSpec(bundle, dest);
-
-        if (log != null)
-        {
-            log.verbose("System packages:");
-            for (String pkg : systemPkgs) {
-                log.verbose(pkg);
-            }
-            log.verbose("Generated " + bundle.getSymbolicName());
-            log.verbose("-----------------------------");
-            for (Map.Entry<Object, Object> e : spec.entrySet())
-            {
-                log.verbose(e.getKey() + "=" + e.getValue());
-                log.verbose("-----------------------------");
-            }
-            log.verbose("BND classpath: " + Arrays.asList(classpath));
-        }
-
-        Builder builder = new Builder();
-        builder.setPedantic(true);
-        builder.setProperties(spec);
-        builder.mergeProperties(env, false);
-
-        builder.setClasspath(classpath);
-        // builder.setSourcepath(sourcepath);
-
-        Jar jar = builder.build();
-
-        convertErrors("BND: ", builder.getErrors());
-        convertWarnings("BND: ", builder.getWarnings());
-
-        Attributes main = jar.getManifest().getMainAttributes();
-        String expHeader = main.getValue(Constants.EXPORT_PACKAGE);
-        log.verbose("BND exports: " + expHeader);
-
-        augmentImports(builder, jar, bundle);
-
-        if (log != null)
-        {
-            for (String warn : warnings)
-            {
-                log.warn(warn);
-            }
-        }
-
-        if (!errors.isEmpty())
-        {
-            throw new Exception(errors.toString());
-        }
-
-        boolean modified = false;
-        File output = new File(dest);
-
-        if (!output.exists() || force || (output.lastModified() <= jar.lastModified())
-            || (output.lastModified() <= project.getLastModified()))
-        {
-            modified = true;
-            // jar.write(dest) catches and ignores IOException
-            OutputStream out = new FileOutputStream(dest);
-            jar.write(out);
-            out.close();
-            jar.close();
-        }
-
-        builder.close();
-
-        return modified;
-    }
-
-    private void augmentImports(Builder builder, Jar jar, IBldBundle bundle)
-        throws IOException
-    {
-        Attributes main = jar.getManifest().getMainAttributes();
-        String impHeader = main.getValue(Constants.IMPORT_PACKAGE);
-        Map<String, Map<String, String>> bndImports = Processor.parseHeader(impHeader,
-            builder);
-
-        if (bndImports.isEmpty())
-            return;
-
-        ArrayList<String> self = new ArrayList<String>();
-        ArrayList<String> missing = new ArrayList<String>();
-        ArrayList<String> modified = new ArrayList<String>();
-        ArrayList<String> unversioned = new ArrayList<String>();
-
-        String expHeader = main.getValue(Constants.EXPORT_PACKAGE);
-        Set<String> bndExports = Processor.parseHeader(expHeader, builder).keySet();
-
-        HashMap<String, IPackageImport> imports = new HashMap<String, IPackageImport>();
-        for (IPackageImport pi : getImports(bundle))
-        {
-            switch (pi.getOSGiImport())
-            {
-                case NEVER:
-                    break;
-                case ALWAYS:
-                    String pkg = pi.getPackageName();
-                    if (!bndImports.containsKey(pkg))
-                    {
-                        // Bnd doesn't think this import is needed - but we know
-                        // better
-                        HashMap<String, String> attrs = new HashMap<String, String>();
-                        attrs.put(BldAttr.VERSION_ATTRIBUTE, pi.getVersions().toString());
-                        bndImports.put(pkg, attrs);
-                        modified.add(pkg + ";resolve=runtime");
-                    }
-                    // fall thru */
-                case AUTO:
-                    imports.put(pi.getPackageName(), pi);
-                    break;
-            }
-        }
-
-        boolean importDot = false;
-
-        for (String pkg : bndImports.keySet())
-        {
-            unused.remove(pkg);
-            Map<String, String> attrs = bndImports.get(pkg);
-            String currentVersion = (String) attrs.get(BldAttr.VERSION_ATTRIBUTE);
-            IPackageImport pi = imports.get(pkg);
-
-            if (pi != null)
-            {
-                VersionRange range = pi.getVersions();
-                String version = range.toString();
-
-                if (!version.equals(currentVersion)
-                    && !range.equals(VersionRange.ANY_VERSION))
-                {
-                    attrs.put(BldAttr.VERSION_ATTRIBUTE, version);
-                    if (pi.isOptional())
-                        attrs.put(BldAttr.RESOLUTION_ATTRIBUTE,
-                            BldAttr.RESOLUTION_OPTIONAL);
-                    modified.add(pkg + ";version=" + version
-                        + (pi.isOptional() ? ";optional" : ""));
-                }
-                else if ((currentVersion == null) && !systemPkgs.contains(pkg))
-                {
-                    unversioned.add(pkg);
-                }
-            }
-            else
-            {
-                // bnd added the import ...
-                if (currentVersion == null)
-                {
-                    String defaultVersion = project.getDefaultPackageVersion(pkg);
-                    if (defaultVersion != null)
-                    {
-                        attrs.put(BldAttr.VERSION_ATTRIBUTE, defaultVersion);
-                        currentVersion = defaultVersion;
-                    }
-                }
-
-                String imp = pkg
-                    + (currentVersion == null ? "" : ";version=" + currentVersion);
-                if (bndExports.contains(pkg))
-                {
-                    self.add(imp);
-                }
-                else
-                {
-                    if (pkg.equals("."))
-                    {
-                        warnings.add("Bnd wants to import '.' (ignored)");
-                        importDot = true;
-                    }
-                    else
-                    {
-                        missing.add(imp);
-                    }
-                }
-            }
-        }
-
-        if (!modified.isEmpty() || importDot)
-        {
-            if (importDot)
-                bndImports.remove(".");
-            // warnings.add("INFO: sigil modified imports: " + modified);
-            main.putValue(Constants.IMPORT_PACKAGE, Processor.printClauses(bndImports,
-                "resolution:"));
-        }
-
-        if (!self.isEmpty())
-        {
-            // warnings.add("INFO: added self imports: " + self);
-        }
-
-        if (!missing.isEmpty())
-        {
-            warnings.add("missing imports (added): " + missing);
-        }
-
-        if (!unversioned.isEmpty())
-        {
-            warnings.add("unversioned imports: " + unversioned);
-        }
-
-        if (bundle.getId().equals(lastBundle))
-        {
-            if (!unused.isEmpty())
-            {
-                warnings.add("unused imports (omitted): " + unused);
-            }
-        }
-    }
-
-    public Properties getBndSpec(IBldBundle bundle, String dest) throws IOException
-    {
-        Properties spec = new Properties();
-
-        String junkHeaders = Constants.INCLUDE_RESOURCE; // shows local build
-        // paths; can be
-        // verbose
-        junkHeaders += "," + Constants.PRIVATE_PACKAGE; // less useful, as we
-        // use it for exported
-        // content too.
-
-        spec.setProperty(Constants.REMOVEHEADERS, junkHeaders);
-        spec.setProperty(Constants.NOEXTRAHEADERS, "true"); // Created-By,
-        // Bnd-LastModified
-        // and Tool
-        spec.setProperty(Constants.CREATED_BY, "sigil.felix.apache.org");
-
-        Properties headers = bundle.getHeaders();
-        // XXX: catch attempts to set headers that conflict with Bnd
-        // instructions we generate?
-        spec.putAll(headers);
-
-        String sn = bundle.isSingleton() ? bundle.getSymbolicName() + ";singleton:=true"
-            : bundle.getSymbolicName();
-
-        spec.setProperty(Constants.BUNDLE_SYMBOLICNAME, sn);
-        spec.setProperty("version", bundle.getVersion());
-        spec.setProperty(Constants.BUNDLE_VERSION, "${version}");
-
-        String activator = bundle.getActivator();
-        if (activator != null)
-            spec.setProperty(Constants.BUNDLE_ACTIVATOR, activator);
-
-        addRequirements(bundle, spec);
-
-        List<String> exports = addExports(bundle, spec);
-
-        addResources(bundle, spec);
-
-        ArrayList<String> contents = new ArrayList<String>();
-        contents.addAll(bundle.getContents());
-
-        if (contents.isEmpty())
-        {
-            if (!project.getSourcePkgs().isEmpty())
-            {
-                contents.addAll(project.getSourcePkgs());
-            }
-            else
-            {
-                contents.addAll(exports);
-            }
-        }
-
-        addLibs(bundle, dest, spec);
-
-        addContents(contents, spec);
-
-        IRequiredBundle fh = bundle.getFragmentHost();
-        if (fh != null)
-        {
-            StringBuilder sb = new StringBuilder();
-            sb.append(fh.getSymbolicName());
-            addVersions(fh.getVersions(), sb);
-            spec.setProperty(Constants.FRAGMENT_HOST, sb.toString());
-        }
-
-        return spec;
-    }
-
-    private void addContents(List<String> contents, Properties spec)
-    {
-        // add contents
-        StringBuilder sb = new StringBuilder();
-        for (String pkg : contents)
-        {
-            if (sb.length() > 0)
-                sb.append(",");
-            sb.append(pkg);
-        }
-
-        if (sb.length() > 0)
-            spec.setProperty(Constants.PRIVATE_PACKAGE, sb.toString());
-    }
-
-    private void appendProperty(String key, String value, Properties p)
-    {
-        String list = p.getProperty(key);
-
-        if (list == null)
-        {
-            list = value;
-        }
-        else
-        {
-            list = list + "," + value;
-        }
-
-        p.setProperty(key, list);
-    }
-
-    private void addLibs(IBldBundle bundle, String dest, Properties spec)
-        throws IOException
-    {
-        // final String cleanVersion =
-        // Builder.cleanupVersion(bundle.getVersion());
-
-        Map<String, Map<String, String>> libs = bundle.getLibs();
-
-        for (String jarpath : libs.keySet())
-        {
-            Map<String, String> attr = libs.get(jarpath);
-            String kind = attr.get(BldAttr.KIND_ATTRIBUTE);
-
-            // first find the lib ..
-            String path = attr.get(BldAttr.PATH_ATTRIBUTE);
-            if (path == null)
-                path = jarpath;
-
-            File fsPath = bundle.resolve(path);
-
-            if (!fsPath.exists())
-            {
-                // try destDir
-                File destDir = new File(dest).getParentFile();
-                File file = new File(destDir, fsPath.getName());
-
-                if (!file.exists())
-                {
-                    // try searching classpath
-                    file = findInClasspathDir(fsPath.getName());
-                }
-
-                if (file != null && file.exists())
-                    fsPath = file;
-            }
-
-            if (!fsPath.exists())
-            {
-                // XXX: find external bundle using name and version range?
-                // For now just let BND fail when it can't find resource.
-            }
-
-            appendProperty(Constants.INCLUDE_RESOURCE, jarpath + "=" + fsPath, spec);
-
-            if ("classpath".equals(kind))
-            {
-                String bcp = spec.getProperty(Constants.BUNDLE_CLASSPATH);
-                if (bcp == null || bcp.length() == 0)
-                    spec.setProperty(Constants.BUNDLE_CLASSPATH, ".");
-                appendProperty(Constants.BUNDLE_CLASSPATH, jarpath, spec);
-            }
-        }
-    }
-
-    private void addResources(IBldBundle bundle, Properties spec)
-    {
-        List<Resource> resources = bundle.getResources();
-        StringBuilder sb = new StringBuilder();
-
-        for (Resource bPath : resources)
-        {
-            if (sb.length() > 0)
-                sb.append(",");
-
-            sb.append(bPath.toBNDInstruction(classpath));
-        }
-
-        if (sb.length() > 0)
-            spec.setProperty(Constants.INCLUDE_RESOURCE, sb.toString());
-    }
-
-    private List<IPackageImport> getImports(IBldBundle bundle)
-    {
-        List<IPackageImport> imports = bundle.getImports();
-        Set<String> pkgs = new HashSet<String>();
-
-        for (IPackageImport pi : imports)
-        {
-            pkgs.add(pi.getPackageName());
-        }
-
-        return imports;
-    }
-
-    private void addRequirements(IBldBundle bundle, Properties spec)
-    {
-        StringBuilder sb = new StringBuilder();
-
-        // option;addMissingImports=true
-        // Lets Bnd calculate imports (i.e. specify *),
-        // which are then examined by augmentImports();
-
-        // option;omitUnusedImports=true (implies addMissingImports=true)
-        // When project contains multiple bundles which don't all use all
-        // imports,
-        // avoids warnings like:
-        // "Importing packages that are never referred to by any class on the Bundle-ClassPath"
-
-        if (omitUnusedImports && !addMissingImports)
-        {
-            warnings.add("omitUnusedImports ignored as addMissingImports=false.");
-            omitUnusedImports = false;
-        }
-
-        sb.setLength(0);
-
-        // allow existing header;Package-Import to specify ignored packages
-        sb.append(spec.getProperty(Constants.IMPORT_PACKAGE, ""));
-
-        buildImports(sb, getImports(bundle));
-
-        if (sb.length() > 0)
-        {
-            spec.setProperty(Constants.IMPORT_PACKAGE, sb.toString());
-        }
-
-        sb.setLength(0);
-
-        buildRequires(sb, bundle.getRequires());
-
-        if (sb.length() > 0)
-        {
-            spec.setProperty(Constants.REQUIRE_BUNDLE, sb.toString());
-        }
-    }
-
-    /**
-     * @param sb
-     * @param list 
-     */
-    private void buildRequires(StringBuilder sb, List<IRequiredBundle> requires)
-    {
-        for (IRequiredBundle rb : requires)
-        {
-            if (sb.length() > 0)
-                sb.append(",");
-            sb.append(rb.getSymbolicName());
-            addVersions(rb.getVersions(), sb);
-        }
-    }
-
-    /**
-     * @param sb
-     */
-    private void buildImports(StringBuilder sb, List<IPackageImport> imports)
-    {
-        for (IPackageImport pi : imports)
-        {
-            switch (pi.getOSGiImport())
-            {
-                case AUTO:
-                    if (omitUnusedImports)
-                        continue; // added by Import-Package: * and fixed by
-                    // augmentImports()
-                    break;
-                case NEVER:
-                    if (pi.isDependency())
-                        continue; // resolve=compile
-                    break;
-                case ALWAYS:
-                    // Bnd will probably whinge that this import is not used.
-                    // we omit it here and replace it in augmentImports,
-                    // but only if addMissingImports is true;
-                    // otherwise, if the import is used, Bnd will fail.
-                    if (addMissingImports)
-                        continue;
-                    break;
-            }
-
-            if (sb.length() > 0)
-                sb.append(",");
-
-            if (pi.getOSGiImport().equals(IPackageImport.OSGiImport.NEVER))
-            {
-                sb.append("!");
-                sb.append(pi.getPackageName());
-            }
-            else
-            {
-                sb.append(pi.getPackageName());
-                addVersions(pi.getVersions(), sb);
-
-                if (pi.isOptional())
-                {
-                    sb.append(";resolution:=optional");
-                }
-            }
-        }
-
-        if (sb.length() > 0)
-            sb.append(",");
-
-        if (addMissingImports)
-        {
-            sb.append("*");
-        }
-        else
-        {
-            sb.append("!*");
-        }
-    }
-
-    private List<String> addExports(IBldBundle bundle, Properties spec)
-    {
-        List<IPackageExport> exports = bundle.getExports();
-        ArrayList<String> list = new ArrayList<String>();
-        StringBuilder sb = new StringBuilder();
-
-        for (IPackageExport export : exports)
-        {
-            if (sb.length() > 0)
-                sb.append(",");
-            sb.append(export.getPackageName());
-            if (!export.getVersion().equals(Version.emptyVersion))
-            {
-                sb.append(";version=\"");
-                sb.append(export.getVersion());
-                sb.append("\"");
-            }
-            list.add(export.getPackageName());
-        }
-
-        if (sb.length() > 0)
-        {
-            // EXPORT_CONTENTS just sets the Export-Package manifest header;
-            // it doesn't add contents like EXPORT_PACKAGE does.
-            spec.setProperty(Constants.EXPORT_CONTENTS, sb.toString());
-        }
-
-        return list;
-    }
-
-    private void addVersions(VersionRange range, StringBuilder sb)
-    {
-        if (!range.equals(VersionRange.ANY_VERSION))
-        {
-            sb.append(";version=\"");
-            sb.append(range);
-            sb.append("\"");
-        }
-    }
-
-    private File findInClasspathDir(String file)
-    {
-        for (File cp : classpath)
-        {
-            if (cp.isDirectory())
-            {
-                File path = new File(cp, file);
-                if (path.exists())
-                {
-                    return path;
-                }
-            }
-        }
-
-        return null;
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldAttr.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/BldAttr.java
deleted file mode 100644
index 930fd72..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldAttr.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config;
-
-public class BldAttr
-{
-    // Sigil attributes
-
-    public static final String KIND_ATTRIBUTE = "kind";
-
-    public static final String RESOLVE_ATTRIBUTE = "resolve";
-    public static final String RESOLVE_AUTO = "auto";
-    public static final String RESOLVE_COMPILE = "compile";
-    public static final String RESOLVE_RUNTIME = "runtime";
-    public static final String RESOLVE_IGNORE = "ignore";
-
-    public static final String PATH_ATTRIBUTE = "path";
-
-    // Sigil options
-
-    public static final String OPTION_ADD_IMPORTS = "addMissingImports";
-    public static final String OPTION_OMIT_IMPORTS = "omitUnusedImports";
-
-    // OSGi attributes
-
-    public static final String RESOLUTION_ATTRIBUTE = "resolution";
-    public static final String RESOLUTION_OPTIONAL = "optional";
-
-    public static final String VERSION_ATTRIBUTE = "version";
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldConfig.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/BldConfig.java
deleted file mode 100644
index c3d72f9..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldConfig.java
+++ /dev/null
@@ -1,658 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.TreeMap;
-
-import org.apache.felix.sigil.common.util.QuoteUtil;
-
-public class BldConfig implements Cloneable
-{
-    // control properties
-    public static final String C_BUNDLES = "-bundles";
-    public static final String C_REPOSITORIES = "-repositories";
-    public static final String C_REPOSITORY_PATH = "-repositorypath";
-
-    // string properties
-    public static final String S_ACTIVATOR = "-activator";
-    public static final String S_DEFAULTS = "-defaults";
-    public static final String S_SINGLETON = "-singleton";
-    public static final String S_ID = "id";
-    public static final String S_SYM_NAME = "name";
-    public static final String S_VERSION = "version";
-    public static final String[] STRING_KEYS = { S_ACTIVATOR, S_DEFAULTS, S_ID,
-            S_SYM_NAME, S_VERSION, S_SINGLETON };
-
-    // list properties
-    public static final String L_CONTENTS = "-contents";
-    public static final String L_SRC_CONTENTS = "-sourcedirs";
-    public static final String L_RESOURCES = "-resources";
-    public static final String[] LIST_KEYS = { L_CONTENTS, L_SRC_CONTENTS, L_RESOURCES };
-
-    // map properties
-    public static final String M_EXPORTS = "-exports";
-    public static final String M_IMPORTS = "-imports";
-    public static final String M_REQUIRES = "-requires";
-    public static final String M_FRAGMENT = "-fragment";
-    public static final String M_LIBS = "-libs";
-    public static final String[] MAP_KEYS = { M_EXPORTS, M_IMPORTS, M_REQUIRES,
-            M_FRAGMENT, M_LIBS };
-
-    // property properties
-    public static final String P_HEADER = "header";
-    public static final String P_OPTION = "option";
-    public static final String P_PACKAGE_VERSION = "package";
-    public static final String P_BUNDLE_VERSION = "bundle";
-    public static final String[] PROP_KEYS = { P_HEADER, P_OPTION, P_PACKAGE_VERSION,
-            P_BUNDLE_VERSION };
-
-    // private constants
-    private static final String LIST_REGEX = ",\\s*";
-    private static final String MAPATTR_REGEX = ";\\s*";
-    private static final String MAPATTR_SEP = ";";
-    private static final String SUBKEY_SEP = ";";
-    
-    // configuration is stored in typed maps
-    private Map<String, String> string = new TreeMap<String, String>();
-    private Map<String, List<String>> list = new TreeMap<String, List<String>>();
-    private Map<String, Map<String, Map<String, String>>> map = new TreeMap<String, Map<String, Map<String, String>>>();
-    private Map<String, BldConfig> config = new TreeMap<String, BldConfig>();
-    private Map<String, Properties> property = new TreeMap<String, Properties>();
-
-    // default config - not modified or saved
-    private BldConfig dflt;
-
-    private Properties unknown = new Properties();
-    private String comment = "";
-    private final URI location;
-
-    public BldConfig()
-    {
-        this.location = null;
-    }
-    
-    public BldConfig(URI loc)
-    {
-        this.location = loc;
-    }
-
-    public BldConfig(Properties p) throws IOException
-    {
-        this.location = null;
-        merge(p);
-    }
-
-    public void setDefault(BldConfig dflt)
-    {
-        this.dflt = dflt;
-    }
-
-    public void setComment(String comment)
-    {
-        this.comment = comment;
-    }
-
-    public Properties getUnknown()
-    {
-        return unknown;
-    }
-
-    /**
-     * @param name
-     * @return
-     */
-    public URI getDefinition(String id, String key)
-    {
-        URI def = null;
-        if (dflt != null)
-            def = dflt.getDefinition(id, key);
-
-        if ( def == null ) {
-            if (property.containsKey(key)) {
-                def = location;
-            }
-            else if (id != null && config.containsKey(id))
-            {
-                Properties p2 = config.get(id).getProps(null, key);
-                if (p2 != null)
-                    def = location;
-            }
-        }
-
-        return def;
-    }
-
-    public String getString(String id, String key)
-    {
-        if (id != null && config.containsKey(id))
-        {
-            String value = config.get(id).getString(null, key);
-            if (value != null)
-                return value;
-        }
-        return string.containsKey(key) ? string.get(key)
-            : (dflt != null ? dflt.getString(id, key) : null);
-    }
-
-    public List<String> getList(String id, String key)
-    {
-        if (id != null && config.containsKey(id))
-        {
-            List<String> value = config.get(id).getList(null, key);
-            if (value != null)
-                return value;
-        }
-        return list.containsKey(key) ? list.get(key) : (dflt != null ? dflt.getList(id,
-            key) : Collections.<String> emptyList());
-    }
-
-    public Map<String, Map<String, String>> getMap(String id, String key)
-    {
-        if (id != null && config.containsKey(id))
-        {
-            Map<String, Map<String, String>> value = config.get(id).getMap(null, key);
-            if (value != null)
-                return value;
-        }
-        return map.containsKey(key) ? map.get(key) : (dflt != null ? dflt.getMap(id, key)
-            : Collections.<String, Map<String, String>> emptyMap());
-    }
-
-    public void setString(String id, String key, String value)
-    {
-        if (!value.equals(getString(id, key)))
-        {
-            if (id != null)
-            {
-                if (!config.containsKey(id))
-                    config.put(id, new BldConfig());
-                config.get(id).setString(null, key, value);
-            }
-            else
-            {
-                String dval = (dflt != null ? dflt.getString(null, key) : null);
-                if (value.equals("") && (dval == null || dval.equals("")))
-                {
-                    string.remove(key);
-                }
-                else
-                {
-                    string.put(key, value);
-                }
-            }
-        }
-    }
-
-    public void setList(String id, String key, List<String> value)
-    {
-        if (!value.equals(getList(id, key)))
-        {
-            if (id != null)
-            {
-                if (!config.containsKey(id))
-                    config.put(id, new BldConfig());
-                config.get(id).setList(null, key, value);
-            }
-            else if (value.isEmpty()
-                && (dflt == null || dflt.getList(null, key).isEmpty()))
-            {
-                list.remove(key);
-            }
-            else
-            {
-                list.put(key, value);
-            }
-        }
-    }
-
-    public void setMap(String id, String key, Map<String, Map<String, String>> value)
-    {
-        if (!value.equals(getMap(id, key)))
-        {
-            if (id != null)
-            {
-                if (!config.containsKey(id))
-                    config.put(id, new BldConfig());
-                config.get(id).setMap(null, key, value);
-            }
-            else if (value.isEmpty()
-                && (dflt == null || dflt.getMap(null, key).isEmpty()))
-            {
-                map.remove(key);
-            }
-            else
-            {
-                map.put(key, value);
-            }
-        }
-    }
-
-    public Properties getProps(String id, String key)
-    {
-        // merge main and sub properties
-        Properties props = new Properties();
-
-        if (dflt != null)
-            props.putAll(dflt.getProps(id, key));
-
-        if (property.containsKey(key))
-            props.putAll(property.get(key));
-
-        if (id != null && config.containsKey(id))
-        {
-            Properties p2 = config.get(id).getProps(null, key);
-            if (p2 != null)
-                props.putAll(p2);
-        }
-
-        return props;
-    }
-
-    // only sets one property at a time
-    public void setProp(String id, String key, String k2, String v2)
-    {
-        if (v2 == null)
-            return;
-        Properties props = getProps(id, key);
-        if (!v2.equals(props.getProperty(key)))
-        {
-            if (id != null)
-            {
-                if (!config.containsKey(id))
-                    config.put(id, new BldConfig());
-                config.get(id).setProp(null, key, k2, v2);
-            }
-            else
-            {
-                if (property.containsKey(key))
-                {
-                    property.get(key).put(k2, v2);
-                }
-                else
-                {
-                    Properties value = new Properties();
-                    value.put(k2, v2);
-                    property.put(key, value);
-                }
-            }
-        }
-    }
-
-    /**
-     * write config in Property file format.
-     * This allows us to make it prettier than Properties.store().
-     */
-    public void write(final PrintWriter out)
-    {
-        out.println(comment);
-
-        // Note: don't add date stamp, or file will differ each time it's saved.
-        out.println("# sigil project file, saved by plugin.\n");
-
-        dump("", new Properties()
-        {
-            private static final long serialVersionUID = 1L; //appease eclipse
-
-            @Override
-            public Object put(Object key, Object value)
-            {
-                if (value instanceof String)
-                {
-                    out.println(key + ": " + value);
-                    out.println("");
-                }
-                else if (value instanceof List<?>)
-                {
-                    out.println(key + ": \\");
-                    for (Object k : (List<?>) value)
-                    {
-                        out.println("\t" + k + ", \\");
-                    }
-                    out.println("");
-                }
-                else if (value instanceof Map<?,?>)
-                {
-                    out.println(key + ": \\");
-                    StringBuilder b = new StringBuilder();
-                    for (Map.Entry<?, ?> e : ((Map<?, ?>) value).entrySet())
-                    {
-                        b.append("\t");
-                        b.append(e.getKey());
-                        Map<?, ?> v = (Map<?, ?>) e.getValue();
-                        if (!v.isEmpty())
-                        {
-                            for (Map.Entry<?, ?> e2 : v.entrySet())
-                            {
-                                b.append(MAPATTR_SEP);
-                                b.append(e2.getKey());
-                                b.append("=");
-                                String v2 = e2.getValue().toString();
-                                if (v2.contains(","))
-                                {
-                                    b.append("\"");
-                                    b.append(v2);
-                                    b.append("\"");
-                                }
-                                else
-                                {
-                                    b.append(v2);
-                                }
-                            }
-                        }
-                        b.append(", \\\n");
-                    }
-                    out.println(b.toString());
-                }
-                return null;
-            }
-        });
-        out.println("# end");
-    }
-
-    /**
-     * dump config in pseudo Properties format.
-     * Note: some values are not Strings (they're List<String>).
-     */
-    private void dump(String prefix, Properties p)
-    {
-        for (String key : string.keySet())
-        {
-            p.put(prefix + key, string.get(key));
-        }
-
-        for (String key : list.keySet())
-        {
-            List<String> list2 = list.get(key);
-            p.put(prefix + key, list2);
-        }
-
-        for (String key : map.keySet())
-        {
-            Map<String, Map<String, String>> map2 = map.get(key);
-            p.put(prefix + key, map2);
-        }
-
-        for (String key : property.keySet())
-        {
-            Properties props = property.get(key);
-            for (Object k2 : props.keySet())
-            {
-                p.put(prefix + key + SUBKEY_SEP + k2, props.get(k2));
-            }
-        }
-
-        for (String key : config.keySet())
-        {
-            BldConfig config2 = config.get(key);
-            config2.dump(key + SUBKEY_SEP + prefix, p);
-        }
-
-        for (Object key : unknown.keySet())
-        {
-            String value = unknown.getProperty((String) key);
-            if (value.length() > 0)
-                p.put(prefix + key, value);
-        }
-    }
-
-    /**
-     * merges properties into current configuration.
-     * @param p
-     * @throws IOException 
-     */
-    public void merge(Properties p) throws IOException
-    {
-        if (p.isEmpty())
-            return;
-
-        final List<String> strings = Arrays.asList(STRING_KEYS);
-        final List<String> lists = Arrays.asList(LIST_KEYS);
-        final List<String> maps = Arrays.asList(MAP_KEYS);
-
-        List<String> bundleKeys = new ArrayList<String>();
-        List<String> repoKeys = new ArrayList<String>();
-
-        String bundles = p.getProperty(C_BUNDLES);
-        if (bundles != null)
-        {
-            bundleKeys.addAll(Arrays.asList(bundles.split(LIST_REGEX)));
-            list.put(C_BUNDLES, bundleKeys);
-        }
-
-        String repos = p.getProperty(C_REPOSITORIES);
-        if (repos != null && !list.containsKey(C_REPOSITORIES))
-        {
-            for (String s : repos.split(LIST_REGEX))
-            {
-                repoKeys.add(s.trim());
-            }
-            list.put(C_REPOSITORIES, repoKeys);
-        }
-
-        List<String> subKeys = new ArrayList<String>();
-        subKeys.addAll(Arrays.asList(PROP_KEYS));
-        subKeys.addAll(bundleKeys);
-        subKeys.addAll(repoKeys);
-
-        Map<String, Properties> sub = new TreeMap<String, Properties>();
-
-        for (Object k : p.keySet())
-        {
-            String key = (String) k;
-            if (key.equals(C_BUNDLES) || key.equals(C_REPOSITORIES))
-                continue;
-
-            String[] keys = key.split(SUBKEY_SEP, 2);
-            String value = p.getProperty(key);
-
-            if (keys.length > 1)
-            {
-                Properties p2 = sub.get(keys[0]);
-                if (p2 == null)
-                {
-                    p2 = new Properties();
-                    sub.put(keys[0], p2);
-                    if (!subKeys.contains(keys[0]))
-                    {
-                        // unknown.setProperty(keys[0] + SUBKEY_SEP, "");
-                    }
-                }
-                p2.setProperty(keys[1], value);
-            }
-            else if (strings.contains(key))
-            {
-                if (!string.containsKey(key))
-                    string.put(key, value);
-            }
-            else if (lists.contains(key))
-            {
-                if (!list.containsKey(key))
-                {
-                    ArrayList<String> list2 = new ArrayList<String>();
-                    for (String s : value.split(LIST_REGEX))
-                    {
-                        if (s.trim().length() > 0)
-                        {
-                            list2.add(s.trim());
-                        }
-                    }
-                    if (!list2.isEmpty())
-                    {
-                        list.put(key, list2);
-                    }
-                }
-            }
-            else if (maps.contains(key))
-            {
-                if (!map.containsKey(key))
-                {
-                    Map<String, Map<String, String>> map2 = new TreeMap<String, Map<String, String>>();
-
-                    for (String subValue : QuoteUtil.split(value))
-                    {
-                        if (subValue.trim().length() > 0)
-                        {
-                            String[] split = subValue.split(MAPATTR_REGEX);
-                            Map<String, String> map3 = new TreeMap<String, String>();
-                            for (int i = 1; i < split.length; ++i)
-                            {
-                                String[] keyVal = split[i].split(":?=", 2);
-                                if (keyVal.length != 2)
-                                {
-                                    throw new IOException("attribute missing '=':"
-                                        + subValue);
-                                }
-                                map3.put(keyVal[0], keyVal[1]);
-                            }
-                            map2.put(split[0], map3);
-                        }
-                    }
-
-                    map.put(key, map2);
-                }
-            }
-            else
-            {
-                unknown.setProperty(key, value);
-            }
-        }
-
-        for (String subKey : sub.keySet())
-        {
-            Properties props = sub.get(subKey);
-            if (!props.isEmpty())
-            {
-                if (bundleKeys.contains(subKey))
-                {
-                    BldConfig config2 = new BldConfig(props);
-                    Properties unkProps = config2.getUnknown();
-
-                    if (config2.map.containsKey(M_IMPORTS))
-                        unkProps.setProperty(M_IMPORTS, "");
-
-                    if (config2.map.containsKey(M_REQUIRES))
-                        unkProps.setProperty(M_REQUIRES, "");
-
-                    for (Object unk : unkProps.keySet())
-                    {
-                        unknown.setProperty(subKey + SUBKEY_SEP + unk, "");
-                    }
-                    config.put(subKey, config2);
-                }
-                else
-                {
-                    Properties p2 = property.get(subKey);
-                    if (p2 == null)
-                    {
-                        property.put(subKey, props);
-                    }
-                    else
-                    {
-                        for (Object k : props.keySet())
-                        {
-                            if (!p2.containsKey(k))
-                            {
-                                p2.put(k, props.get(k));
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public String toString()
-    {
-        return "STRING: " + string + " LIST:" + list + " MAP: " + map + " PROPERTY: "
-            + property + " CONFIG:" + config + "\nDFLT{ " + dflt + "}";
-    }
-    
-    public BldConfig clone() {
-        try
-        {
-            BldConfig bc = (BldConfig) super.clone();
-            bc.string = new TreeMap<String, String>(bc.string);
-            bc.list = cloneMap(bc.list);
-            bc.map = cloneMap(bc.map);
-            bc.config = new TreeMap<String, BldConfig>(bc.config);
-            bc.property = new TreeMap<String, Properties>(bc.property);
-
-            // default config - not modified or saved
-            // bc.dflt = bc.dflt.clone();
-
-            bc.unknown = cloneProps(bc.unknown);
-            
-            return bc;
-        }
-        catch (CloneNotSupportedException e)
-        {
-            throw new IllegalStateException(e);
-        }
-    }
-    
-    @SuppressWarnings("unchecked")
-    private static <K, V> Map<K, V> cloneMap(Map<K,V> map) {
-        Map clone = new TreeMap();
-        for (Map.Entry<?,?> e : map.entrySet()) {
-            if ( e.getValue() == null ) {
-                clone.put(e.getKey(), null);
-            }
-            else if ( e.getValue() instanceof List<?> ) {
-                clone.put(e.getKey(), new ArrayList((List<?>) e.getValue()));
-            }
-            else if (e.getValue() instanceof Map<?,?>) {
-                clone.put(e.getKey(), cloneMap((Map<?,?>)e.getValue()));
-            }
-            else if (e.getValue() instanceof String) {
-                clone.put(e.getKey(), e.getValue());
-            }
-            else if (e.getValue() instanceof BldConfig) {
-                BldConfig c = (BldConfig) e.getValue();
-                clone.put(e.getKey(), c.clone());
-            }
-            else if (e.getValue() instanceof Properties) {
-                Properties p = (Properties) e.getValue();
-                clone.put(e.getKey(), cloneProps(p));
-            }
-            else {
-                throw new IllegalStateException("Unexpected value: " + e.getValue());
-            }
-        }
-        return clone;
-    }
-    
-    private static Properties cloneProps(Properties p) {
-        Properties props = new Properties();
-        for (Map.Entry<?,?> pe : props.entrySet()) {
-            props.put(pe.getKey(), pe.getValue());
-        }
-        return props;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldConverter.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/BldConverter.java
deleted file mode 100644
index 5e647e8..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldConverter.java
+++ /dev/null
@@ -1,560 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.felix.sigil.common.config.IBldProject.IBldBundle;
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.core.internal.model.eclipse.SigilBundle;
-import org.apache.felix.sigil.common.core.internal.model.osgi.BundleModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-
-import aQute.lib.osgi.Constants;
-
-public class BldConverter
-{
-    private static final String classpathFormat = "<classpathentry kind=\"%s\" path=\"%s\"/>";
-    private BldConfig config;
-    private Properties packageDefaults;
-    private TreeSet<String> packageWildDefaults;
-
-    public BldConverter(BldConfig config)
-    {
-        this.config = config;
-    }
-
-    /**
-     * converts to an ISigilBundle.
-     * @param id
-     * @param bundle
-     * @return
-     */
-    public ISigilBundle getBundle(String id, IBldBundle bundle)
-    {
-
-        ISigilBundle sigilBundle = new SigilBundle();
-        IBundleModelElement info = new BundleModelElement();
-        sigilBundle.setBundleInfo(info);
-
-        // exports
-        // FIXME: UI doesn't understand export wildcard packages
-        for (IPackageExport export : bundle.getExports())
-        {
-            IPackageExport clone = (IPackageExport) export.clone();
-            clone.setParent(null);
-            info.addExport(clone);
-        }
-
-        // imports
-        for (IPackageImport import1 : bundle.getImports())
-        {
-            IPackageImport clone = (IPackageImport) import1.clone();
-            clone.setParent(null);
-            info.addImport(clone);
-        }
-
-        // requires
-        for (IRequiredBundle require : bundle.getRequires())
-        {
-            IRequiredBundle clone = (IRequiredBundle) require.clone();
-            clone.setParent(null);
-            info.addRequiredBundle(clone);
-        }
-
-        // fragment
-        IRequiredBundle fragment = bundle.getFragmentHost();
-        if (fragment != null)
-        {
-            info.setFragmentHost(fragment);
-        }
-
-        // contents
-        for (String pkg : bundle.getContents())
-        {
-            sigilBundle.addPackage(pkg);
-        }
-
-        // sources
-        for (String source : config.getList(null, BldConfig.L_SRC_CONTENTS))
-        {
-            sigilBundle.addClasspathEntry(String.format(classpathFormat, "src", source));
-        }
-
-        // libs
-        Map<String, Map<String, String>> libs = bundle.getLibs();
-
-        for (String path : libs.keySet())
-        {
-            Map<String, String> attr = libs.get(path);
-            String kind = attr.get(BldAttr.KIND_ATTRIBUTE);
-
-            if ("classpath".equals(kind))
-            {
-                sigilBundle.addClasspathEntry(String.format(classpathFormat, "lib", path));
-            }
-            else
-            {
-                BldCore.error("Can't convert -libs kind=" + kind);
-            }
-        }
-
-        // resources
-        // FIXME: UI doesn't support -resources: path1=path2
-        List<Resource> resources = bundle.getResources();
-        for (Resource resource : resources)
-        {
-            sigilBundle.addSourcePath(resource);
-        }
-
-        ////////////////////
-        // simple headers
-
-        info.setSymbolicName(bundle.getSymbolicName());
-
-        info.setVersion(VersionTable.getVersion(bundle.getVersion()));
-
-        String activator = bundle.getActivator();
-        if (activator != null)
-            info.setActivator(activator);
-
-        Properties headers = config.getProps(id, BldConfig.P_HEADER);
-        String header;
-
-        header = headers.getProperty("CATEGORY");
-        if (header != null)
-            info.setCategory(header);
-
-        header = headers.getProperty(Constants.BUNDLE_CONTACTADDRESS);
-        if (header != null)
-            info.setContactAddress(header);
-
-        header = headers.getProperty(Constants.BUNDLE_COPYRIGHT);
-        if (header != null)
-            info.setCopyright(header);
-
-        header = headers.getProperty(Constants.BUNDLE_DESCRIPTION);
-        if (header != null)
-            info.setDescription(header);
-
-        header = headers.getProperty(Constants.BUNDLE_VENDOR);
-        if (header != null)
-            info.setVendor(header);
-
-        header = headers.getProperty(Constants.BUNDLE_NAME);
-        if (header != null)
-            info.setName(header);
-
-        header = headers.getProperty(Constants.BUNDLE_DOCURL);
-        if (header != null)
-            info.setDocURI(URI.create(header));
-
-        header = headers.getProperty(Constants.BUNDLE_LICENSE);
-        if (header != null)
-            info.setDocURI(URI.create(header));
-
-        return sigilBundle;
-    }
-
-    private VersionRange defaultVersion(VersionRange current, String defaultRange)
-    {
-        if (current.equals(VersionRange.ANY_VERSION)
-            || current.equals(VersionRange.parseVersionRange(defaultRange)))
-        {
-            return null;
-        }
-        return current;
-    }
-
-    // FIXME - copied from BldProject
-    private String getDefaultPackageVersion(String name)
-    {
-        if (packageDefaults == null)
-        {
-            packageDefaults = config.getProps(null, BldConfig.P_PACKAGE_VERSION);
-            packageWildDefaults = new TreeSet<String>();
-
-            for (Object key : packageDefaults.keySet())
-            {
-                String pkg = (String) key;
-                if (pkg.endsWith("*"))
-                {
-                    packageWildDefaults.add(pkg.substring(0, pkg.length() - 1));
-                }
-            }
-        }
-
-        String version = packageDefaults.getProperty(name);
-
-        if (version == null)
-        {
-            for (String pkg : packageWildDefaults)
-            {
-                if (name.startsWith(pkg))
-                {
-                    version = packageDefaults.getProperty(pkg + "*");
-                    // break; -- don't break, as we want the longest match
-                }
-            }
-        }
-
-        return version;
-    }
-
-    /**
-     * converts from an ISigilBundle.
-     * 
-     * @param id
-     * @param bundle
-     */
-    public void setBundle(String id, ISigilBundle bundle)
-    {
-        IBundleModelElement info = bundle.getBundleInfo();
-        String bundleVersion = config.getString(id, BldConfig.S_VERSION);
-        Map<String, Map<String, String>> exports = new TreeMap<String, Map<String, String>>();
-
-        setSimpleHeaders(id, info);
-        setExports(id, bundleVersion, info, exports);
-
-        // -imports and -requires are global to all bundles
-        setImports(null, bundleVersion, info, exports);
-        setRequires(null, bundleVersion, info);
-
-        setFragments(id, info);
-        setContents(id, info, bundle);
-        setLibraries(id, info, bundle);
-        setResources(id, info, bundle);
-
-        if (info.getSourceLocation() != null)
-        {
-            BldCore.error("SourceLocation conversion not yet implemented.");
-        }
-
-        if (!info.getLibraryImports().isEmpty())
-        {
-            BldCore.error("LibraryImports conversion not yet implemented.");
-        }
-    }
-
-    /**
-     * @param id
-     * @param info
-     */
-    private void setSimpleHeaders(String id, IBundleModelElement info)
-    {
-        List<String> ids = config.getList(null, BldConfig.C_BUNDLES);
-        String idBsn = id != null ? id : ids.get(0);
-        String oldBsn = config.getString(id, BldConfig.S_SYM_NAME);
-        String bsn = info.getSymbolicName();
-        if (bsn == null) throw new IllegalArgumentException("Missing bundle symbolic name");
-        
-        if (!bsn.equals(idBsn) || oldBsn != null)
-            config.setString(id, BldConfig.S_SYM_NAME, bsn);
-
-        String version = info.getVersion().toString();
-        if (version != null)
-            config.setString(id, BldConfig.S_VERSION, version);
-
-        String activator = info.getActivator();
-        if (activator != null)
-            config.setString(id, BldConfig.S_ACTIVATOR, activator);
-
-        Properties headers = config.getProps(null, BldConfig.P_HEADER);
-
-        setHeader(headers, id, "CATEGORY", info.getCategory());
-        setHeader(headers, id, Constants.BUNDLE_CONTACTADDRESS, info.getContactAddress());
-        setHeader(headers, id, Constants.BUNDLE_COPYRIGHT, info.getCopyright());
-        setHeader(headers, id, Constants.BUNDLE_DESCRIPTION, info.getDescription());
-        setHeader(headers, id, Constants.BUNDLE_VENDOR, info.getVendor());
-        setHeader(headers, id, Constants.BUNDLE_NAME, info.getName());
-
-        if (info.getDocURI() != null)
-            config.setProp(id, BldConfig.P_HEADER, Constants.BUNDLE_DOCURL,
-                info.getDocURI().toString());
-
-        if (info.getLicenseURI() != null)
-            config.setProp(id, BldConfig.P_HEADER, Constants.BUNDLE_LICENSE,
-                info.getLicenseURI().toString());
-    }
-
-    /**
-     * @param id
-     * @param info
-     * @param bundle 
-     */
-    private void setResources(String id, IBundleModelElement info, ISigilBundle bundle)
-    {
-        // resources
-        ArrayList<String> resources = new ArrayList<String>();
-        for (Resource ipath : bundle.getSourcePaths())
-        {
-            resources.add(ipath.toString());
-        }
-
-        if (!resources.isEmpty() || !config.getList(id, BldConfig.L_RESOURCES).isEmpty())
-        {
-            Collections.sort(resources);
-            config.setList(id, BldConfig.L_RESOURCES, resources);
-        }
-    }
-
-    /**
-     * @param id 
-     * @param info
-     * @param bundle 
-     */
-    private void setLibraries(String id, IBundleModelElement info, ISigilBundle bundle)
-    {
-        // libs
-        Map<String, Map<String, String>> libs = new TreeMap<String, Map<String, String>>();
-        List<String> sources = new ArrayList<String>();
-
-        // classpathEntries map to -libs or -sources
-        for (String entry : bundle.getClasspathEntrys())
-        {
-            // <classpathentry kind="lib" path="lib/dependee.jar"/>
-            // <classpathentry kind="src" path="src"/>
-            final String regex = ".* kind=\"([^\"]+)\" path=\"([^\"]+)\".*";
-            Pattern pattern = Pattern.compile(regex);
-            Matcher matcher = pattern.matcher(entry);
-            if (matcher.matches())
-            {
-                String kind = matcher.group(1);
-                String path = matcher.group(2);
-                if (kind.equals("lib"))
-                {
-                    Map<String, String> map2 = new TreeMap<String, String>();
-                    map2.put(BldAttr.KIND_ATTRIBUTE, "classpath");
-                    libs.put(path, map2);
-                }
-                else if (kind.equals("src"))
-                {
-                    sources.add(path);
-                }
-                else
-                {
-                    BldCore.error("unknown classpathentry kind=" + kind);
-                }
-            }
-            else
-            {
-                BldCore.error("can't match classpathEntry in: " + entry);
-            }
-        }
-
-        if (!libs.isEmpty() || !config.getMap(id, BldConfig.M_LIBS).isEmpty())
-        {
-            config.setMap(id, BldConfig.M_LIBS, libs);
-        }
-
-        // -sourcedirs is global to all bundles
-        if (!sources.isEmpty()
-            || !config.getList(null, BldConfig.L_SRC_CONTENTS).isEmpty())
-        {
-            config.setList(null, BldConfig.L_SRC_CONTENTS, sources);
-        }
-
-    }
-
-    /**
-     * @param id 
-     * @param info
-     * @param bundle 
-     */
-    private void setContents(String id, IBundleModelElement info, ISigilBundle bundle)
-    {
-        // contents
-        List<String> contents = new ArrayList<String>();
-        for (String pkg : bundle.getPackages())
-        {
-            contents.add(pkg);
-        }
-        if (!contents.isEmpty() || !config.getList(id, BldConfig.L_CONTENTS).isEmpty())
-        {
-            config.setList(id, BldConfig.L_CONTENTS, contents);
-        }
-    }
-
-    /**
-     * @param id
-     * @param info
-     */
-    private void setFragments(String id, IBundleModelElement info)
-    {
-        Properties defaultBundles = config.getProps(null, BldConfig.P_BUNDLE_VERSION);
-        Map<String, Map<String, String>> fragments = new TreeMap<String, Map<String, String>>();
-        IRequiredBundle fragment = info.getFragmentHost();
-        if (fragment != null)
-        {
-            Map<String, String> map2 = new TreeMap<String, String>();
-            String name = fragment.getSymbolicName();
-            VersionRange versions = defaultVersion(fragment.getVersions(),
-                defaultBundles.getProperty(name));
-            if (versions != null)
-                map2.put(BldAttr.VERSION_ATTRIBUTE, versions.toString());
-            fragments.put(name, map2);
-        }
-        if (!fragments.isEmpty() || !config.getMap(id, BldConfig.M_FRAGMENT).isEmpty())
-        {
-            config.setMap(id, BldConfig.M_FRAGMENT, fragments);
-        }
-    }
-
-    /**
-     * @param id
-     * @param bundleVersion
-     * @param info
-     */
-    private void setRequires(String id, String bundleVersion, IBundleModelElement info)
-    {
-        // requires
-        Properties defaultBundles = config.getProps(null, BldConfig.P_BUNDLE_VERSION);
-        Map<String, Map<String, String>> requires = new TreeMap<String, Map<String, String>>();
-
-        for (IRequiredBundle require : info.getRequiredBundles())
-        {
-            Map<String, String> map2 = new TreeMap<String, String>();
-            String name = require.getSymbolicName();
-            VersionRange versions = defaultVersion(require.getVersions(),
-                defaultBundles.getProperty(name));
-            if (versions != null)
-                map2.put(BldAttr.VERSION_ATTRIBUTE, versions.toString());
-            requires.put(name, map2);
-        }
-        if (!requires.isEmpty() || !config.getMap(id, BldConfig.M_REQUIRES).isEmpty())
-        {
-            config.setMap(id, BldConfig.M_REQUIRES, requires);
-        }
-    }
-
-    /**
-     * @param bundleVersion 
-     * @param info
-     * @param exports 
-     */
-    private void setImports(String id, String bundleVersion, IBundleModelElement info,
-        Map<String, Map<String, String>> exports)
-    {
-        // imports
-        Map<String, Map<String, String>> imports = new TreeMap<String, Map<String, String>>();
-
-        // FIXME: default version logic is wrong here
-        //    if the version to be saved is the same as the default version,
-        //    then we should _remove_ the version from the value being saved,
-        //    since config.getMap() does not apply default versions.
-        for (IPackageImport import1 : info.getImports())
-        {
-            Map<String, String> map2 = new TreeMap<String, String>();
-            String name = import1.getPackageName();
-            VersionRange versions = defaultVersion(import1.getVersions(),
-                getDefaultPackageVersion(name));
-
-            boolean isDependency = import1.isDependency();
-            Map<String, String> selfImport = exports.get(name);
-
-            if (selfImport != null)
-            {
-                // avoid saving self-import attributes, e.g.
-                // org.cauldron.newton.example.fractal.engine;resolve=auto;version=1.0.0
-                isDependency = true;
-
-                if (versions != null)
-                {
-                    String exportVersion = selfImport.get(BldAttr.VERSION_ATTRIBUTE);
-                    if (exportVersion == null)
-                        exportVersion = bundleVersion;
-
-                    if (exportVersion.equals(versions.toString()))
-                    {
-                        versions = null;
-                    }
-                }
-            }
-
-            if (versions != null)
-            {
-                map2.put(BldAttr.VERSION_ATTRIBUTE, versions.toString());
-            }
-
-            if (import1.isOptional())
-            {
-                map2.put(BldAttr.RESOLUTION_ATTRIBUTE, BldAttr.RESOLUTION_OPTIONAL);
-            }
-
-            String resolve = BldProject.getResolve(import1, isDependency);
-            if (resolve != null)
-                map2.put(BldAttr.RESOLVE_ATTRIBUTE, resolve);
-
-            imports.put(name, map2);
-        }
-        if (!imports.isEmpty() || !config.getMap(id, BldConfig.M_IMPORTS).isEmpty())
-        {
-            config.setMap(id, BldConfig.M_IMPORTS, imports);
-        }
-    }
-
-    /**
-     * @param id 
-     * @param info 
-     * @param bundleVersion 
-     * @param exports 
-     * 
-     */
-    private void setExports(String id, String bundleVersion, IBundleModelElement info,
-        Map<String, Map<String, String>> exports)
-    {
-        for (IPackageExport export : info.getExports())
-        {
-            Map<String, String> map2 = new TreeMap<String, String>();
-            String version = export.getVersion().toString();
-            if (!version.equals(bundleVersion))
-                map2.put(BldAttr.VERSION_ATTRIBUTE, version);
-            exports.put(export.getPackageName(), map2);
-        }
-
-        if (!exports.isEmpty() || !config.getMap(id, BldConfig.M_EXPORTS).isEmpty())
-        {
-            config.setMap(id, BldConfig.M_EXPORTS, exports);
-        }
-    }
-
-    private void setHeader(Properties headers, String id, String key, String value)
-    {
-        if (value == null)
-            value = "";
-        if (!value.equals(headers.getProperty(key, "")))
-            config.setProp(id, BldConfig.P_HEADER, key, value);
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldFactory.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/BldFactory.java
deleted file mode 100644
index 3a9bff8..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldFactory.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-public class BldFactory
-{
-    private static Map<URI, BldProject> projects = new HashMap<URI, BldProject>();
-
-    public static IBldProject getProject(URI uri) throws IOException
-    {
-        return load(uri, false, null);
-    }
-
-    public static IBldProject getProject(URI uri, Properties overrides)
-        throws IOException
-    {
-        return load(uri, false, overrides);
-    }
-
-    public static IBldProject getProject(URI uri, boolean ignoreCache) throws IOException
-    {
-        return load(uri, ignoreCache, null);
-    }
-
-    public static IRepositoryConfig getConfig(URI uri) throws IOException
-    {
-        return load(uri, false, null);
-    }
-
-    /**
-     * creates a new project file, initialised with defaults.
-     * @param uri where the file will be saved - used to resolve relative paths.
-     * @param defaults relative path to defaults file - default ../sigil.properties.
-     * @return
-     * @throws IOException
-     */
-    public static IBldProject newProject(URI uri, String defaults) throws IOException
-    {
-        BldProject project = new BldProject(uri, null);
-        Properties p = new Properties();
-        if (defaults != null)
-            p.setProperty(BldConfig.S_DEFAULTS, defaults);
-        project.loadDefaults(p);
-        return project;
-    }
-
-    private synchronized static BldProject load(URI uri, boolean ignoreCache,
-        Properties overrides) throws IOException
-    {
-        BldProject p = null;
-        if (!ignoreCache)
-        {
-            p = projects.get(uri);
-        }
-
-        if (p == null)
-        {
-            p = new BldProject(uri, overrides);
-            p.load();
-            projects.put(uri, p);
-
-            if (Boolean.getBoolean("org.apache.felix.sigil.config.test"))
-            {
-                File path = new File(uri.getPath() + ".tmp");
-                System.out.println("XXX: config.test writing: " + path);
-                p.saveAs(path);
-            }
-        }
-        return p;
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldProject.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/BldProject.java
deleted file mode 100644
index 43b4c40..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldProject.java
+++ /dev/null
@@ -1,1059 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.TreeSet;
-
-import org.apache.felix.sigil.common.config.internal.InlineResource;
-import org.apache.felix.sigil.common.config.internal.PreprocessedResource;
-import org.apache.felix.sigil.common.config.internal.StandardResource;
-import org.apache.felix.sigil.common.core.internal.model.osgi.BundleModelElement;
-import org.apache.felix.sigil.common.core.internal.model.osgi.PackageExport;
-import org.apache.felix.sigil.common.core.internal.model.osgi.PackageImport;
-import org.apache.felix.sigil.common.core.internal.model.osgi.RequiredBundle;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport.OSGiImport;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-
-public class BldProject implements IBldProject, IRepositoryConfig, Cloneable
-{
-    private static final String OVERRIDE_PREFIX = "sigil.";
-    private static final int MAX_HEADER = 10240;
-    // cache to avoid loading the same default config for each project
-    private static Map<URI, BldConfig> defaultsCache = new HashMap<URI, BldConfig>();
-    private static Properties sysOverrides;
-
-    private Properties bldOverrides;
-    private List<String> sourcePkgs;
-    private BldConfig config;
-    private BldConverter convert;
-    private BundleModelElement requirements;
-    private final File baseDir;
-    private URI loc;
-    private Properties packageDefaults;
-    private TreeSet<String> packageWildDefaults;
-    private long lastModified;
-
-    /* package */BldProject(URI relLoc, Properties overrides)
-    {
-        loc = new File(".").toURI().resolve(relLoc).normalize();
-        config = new BldConfig(loc);
-        convert = new BldConverter(config);
-        File f = new File(loc);
-        lastModified = f.lastModified();
-        baseDir = f.getParentFile();
-        bldOverrides = overrides;
-    }
-
-    /* package */void load() throws IOException
-    {
-        // allow System property overrides, e.g.
-        // ANT_OPTS='-Dsigil.option\;addMissingImports=false' ant
-        config.merge(getOverrides());
-
-        InputStream in = null;
-        try
-        {
-            in = loc.toURL().openStream();
-            BufferedInputStream bis = new BufferedInputStream(in);
-            bis.mark(MAX_HEADER);
-            readHeader(bis);
-            bis.reset();
-
-            Properties p = new Properties();
-            p.load(bis);
-            config.merge(p);
-
-            Properties unknown = config.getUnknown();
-            if (!unknown.isEmpty())
-                System.err.println("WARN: unknown keys " + unknown.keySet() + " in "
-                    + loc);
-
-            loadDefaults(p);
-            requirements = parseRequirements();
-        }
-        finally
-        {
-            if (in != null)
-            {
-                in.close();
-            }
-        }
-
-        //System.err.println("XXX loc=" + loc + ", BldConfig: " + config);
-    }
-
-    /* package */void loadDefaults(Properties p) throws IOException
-    {
-        BldConfig c = loadDefaults(p, baseDir, null);
-        config.setDefault(c);
-
-        Properties options = config.getProps(null, BldConfig.P_OPTION);
-
-        if (!options.containsKey(BldAttr.OPTION_ADD_IMPORTS))
-            c.setProp(null, BldConfig.P_OPTION, BldAttr.OPTION_ADD_IMPORTS, "true");
-
-        // default omitUnusedImports option depends on number of bundles...
-        // we set it here to avoid it being written by save(),
-        // but as this may alter cached defaults, once set we have to reset it
-        // for each project.
-
-        boolean omitSet = options.containsKey("__omit_set__");
-        boolean multiple = getBundleIds().size() > 1;
-
-        if (multiple || omitSet)
-        {
-            if (!options.containsKey(BldAttr.OPTION_OMIT_IMPORTS) || omitSet)
-            {
-                c.setProp(null, BldConfig.P_OPTION, BldAttr.OPTION_OMIT_IMPORTS, multiple
-                    + "");
-                c.setProp(null, BldConfig.P_OPTION, "__omit_set__", "true");
-            }
-        }
-    }
-
-    private synchronized BldConfig loadDefaults(Properties props, File base,
-        BldConfig dflt) throws IOException
-    {
-        boolean cached = false;
-        String defaults = props.getProperty(BldConfig.S_DEFAULTS);
-
-        if (defaults != null)
-        {
-            defaults = BldUtil.expand(defaults, new BldProperties(base, bldOverrides));
-        }
-        else
-        {
-            defaults = "-" + IBldProject.PROJECT_DEFAULTS;
-        }
-
-        if (base != null && defaults.length() > 0)
-        {
-            boolean ignore = defaults.startsWith("-");
-
-            if (ignore)
-                defaults = defaults.substring(1);
-
-            try
-            {
-                File file = new File(defaults);
-                if (!file.isAbsolute())
-                {
-                    file = new File(base, defaults);
-                }
-                file = file.getCanonicalFile();
-
-                URI uri = file.toURI();
-                BldProperties bp = new BldProperties(file.getParentFile(), bldOverrides);
-
-                if (dflt == null)
-                {
-                    dflt = defaultsCache.get(uri);
-                    if (dflt != null)
-                        return dflt;
-
-                    dflt = new BldConfig(uri);
-                    defaultsCache.put(uri, dflt);
-                    cached = true;
-                }
-
-                Properties p = new Properties();
-                InputStream stream = uri.toURL().openStream();
-                p.load(stream);
-                stream.close();
-
-                // expand variables in defaults
-                for (Object k : p.keySet())
-                {
-                    String key = (String) k;
-                    String value = p.getProperty(key);
-                    p.setProperty(key, BldUtil.expand(value, bp));
-                }
-
-                dflt.merge(p);
-
-                ignore = false;
-                loadDefaults(p, file.getParentFile(), dflt);
-            }
-            catch (IOException e)
-            {
-                if (!ignore)
-                    throw e;
-            }
-        }
-
-        if (dflt == null)
-            return new BldConfig();
-
-        if (cached)
-        {
-            Properties unknown = dflt.getUnknown();
-            if (!unknown.isEmpty())
-                System.err.println("WARN: unknown keys " + unknown.keySet()
-                    + " in defaults for " + loc);
-        }
-
-        return dflt;
-    }
-
-    private static Properties getOverrides()
-    {
-        if (sysOverrides == null)
-        {
-            sysOverrides = new Properties();
-            Properties sysProps = System.getProperties();
-
-            for (Object okey : sysProps.keySet())
-            {
-                String key = (String) okey;
-                if (key.startsWith(OVERRIDE_PREFIX))
-                {
-                    sysOverrides.setProperty(key.substring(OVERRIDE_PREFIX.length()),
-                        sysProps.getProperty(key));
-                }
-            }
-        }
-
-        return sysOverrides;
-    }
-
-    private void readHeader(InputStream in) throws IOException
-    {
-        BufferedReader r = new BufferedReader(new InputStreamReader(in));
-        StringBuffer header = new StringBuffer();
-        String line;
-        while ((line = r.readLine()) != null)
-        {
-            if (line.startsWith("#"))
-            {
-                header.append(line);
-                header.append("\n");
-            }
-            else
-            {
-                config.setComment(header.toString());
-                break;
-            }
-        }
-    }
-
-    public File resolve(String path)
-    {
-        File file = new File(path);
-        if (!file.isAbsolute())
-        {
-            // can't use loc.resolve(value), as value may not be valid URI.
-            file = new File(baseDir, path);
-        }
-        return file;
-    }
-
-    public Resource newResource(String location)
-    {
-        String[] paths = location.split("=", 2);
-        String bPath = paths[0];
-        String fsPath = (paths.length > 1 ? paths[1] : null);
-        if (bPath.startsWith("@"))
-        {
-            bPath = bPath.substring(1);
-            return new InlineResource(BldProject.this, bPath);
-        }
-        else if (bPath.startsWith("{"))
-        {
-            bPath = bPath.substring(1, bPath.length() - 1);
-            return new PreprocessedResource(BldProject.this, bPath, fsPath);
-        }
-        else
-        {
-            return new StandardResource(BldProject.this, bPath, fsPath);
-        }
-    }
-
-    public String getVersion()
-    {
-        String version = config.getString(null, BldConfig.S_VERSION);
-        return version == null ? "0" : version;
-    }
-
-    public IBundleModelElement getDependencies()
-    {
-        IBundleModelElement dependencies = new BundleModelElement();
-
-        for (IModelElement element : getRequirements().children())
-        {
-            if (element instanceof IPackageImport)
-            {
-                IPackageImport import1 = (IPackageImport) element;
-                if (!import1.isDependency())
-                    continue;
-
-                IPackageImport pi = (IPackageImport) (element.clone());
-                pi.setParent(null);
-                dependencies.addImport(pi);
-            }
-            else
-            {
-                IRequiredBundle rb = (IRequiredBundle) (element.clone());
-                rb.setParent(null);
-                dependencies.addRequiredBundle(rb);
-            }
-        }
-
-        return dependencies;
-    }
-
-    private IBundleModelElement getRequirements()
-    {
-        return requirements;
-    }
-
-    /*
-     * private boolean globMatch(String pkg, Set<String> set) { // exact match
-     * if (set.contains(pkg)) return true;
-     * 
-     * // org.foo.bar matches org.foo. for (String glob : set) { if
-     * (glob.matches(pkg)) { return true; } }
-     * 
-     * return false; }
-     */
-
-    /**
-     * set internal OSGiImport and isDependency flags, based on external
-     * resolve= attribute.
-     */
-    // OSGiImport:    AUTO    ALWAYS     NEVER
-    // dependency:    default -          compile
-    // !dependency:   auto    runtime    ignore
-
-    private void setResolve(IPackageImport pi, String resolve) throws IOException
-    {
-        if (pi.isOptional())
-            pi.setDependency(false);
-
-        if (BldAttr.RESOLVE_COMPILE.equals(resolve))
-        {
-            if (pi.isOptional())
-                pi.setDependency(true);
-            else
-                pi.setOSGiImport(OSGiImport.NEVER);
-        }
-        else if (BldAttr.RESOLVE_RUNTIME.equals(resolve))
-        {
-            pi.setDependency(false);
-            pi.setOSGiImport(OSGiImport.ALWAYS);
-        }
-        else if (BldAttr.RESOLVE_AUTO.equals(resolve))
-        {
-            pi.setDependency(false);
-        }
-        else if (BldAttr.RESOLVE_IGNORE.equals(resolve))
-        {
-            pi.setDependency(false);
-            pi.setOSGiImport(OSGiImport.NEVER);
-        }
-        else if (resolve != null)
-        {
-            throw new IOException("Bad attribute value: " + BldAttr.RESOLVE_ATTRIBUTE
-                + "=" + resolve);
-        }
-    }
-
-    /**
-     * get external resolve= attribute from internal PackageImport flags. This
-     * is called from BldConverter.setBundle().
-     */
-    public static String getResolve(IPackageImport pi, boolean isDependency)
-    {
-        OSGiImport osgiImport = pi.getOSGiImport();
-        String resolve = null;
-
-        if (isDependency)
-        {
-            if (osgiImport.equals(OSGiImport.NEVER) || pi.isOptional())
-                resolve = BldAttr.RESOLVE_COMPILE;
-        }
-        else
-        {
-            switch (osgiImport)
-            {
-                case ALWAYS:
-                    resolve = BldAttr.RESOLVE_RUNTIME;
-                    break;
-                case AUTO:
-                    resolve = BldAttr.RESOLVE_AUTO;
-                    break;
-                case NEVER:
-                    resolve = BldAttr.RESOLVE_IGNORE;
-                    break;
-            }
-        }
-        return resolve;
-    }
-
-    public String getDefaultPackageVersion(String name)
-    {
-        if (packageDefaults == null)
-        {
-            packageDefaults = config.getProps(null, BldConfig.P_PACKAGE_VERSION);
-            packageWildDefaults = new TreeSet<String>();
-
-            for (Object key : packageDefaults.keySet())
-            {
-                String pkg = (String) key;
-                if (pkg.endsWith("*"))
-                {
-                    packageWildDefaults.add(pkg.substring(0, pkg.length() - 1));
-                }
-            }
-        }
-
-        String version = packageDefaults.getProperty(name);
-
-        if (version == null)
-        {
-            for (String pkg : packageWildDefaults)
-            {
-                if (name.startsWith(pkg))
-                {
-                    version = packageDefaults.getProperty(pkg + "*");
-                    // break; -- don't break, as we want the longest match
-                }
-            }
-        }
-
-        return version;
-    }
-
-    private synchronized BundleModelElement parseRequirements() throws IOException
-    {
-        BundleModelElement reqs = new BundleModelElement();
-
-        List<String> sourceContents = getSourcePkgs();
-        HashSet<String> exports = new HashSet<String>();
-
-        parseExports(reqs, exports);
-
-        parseImports(reqs, sourceContents, exports);
-
-        parseRequires(reqs);
-
-        return reqs;
-    }
-
-    /**
-     * @param reqs
-     * @param exports
-     */
-    private void parseExports(BundleModelElement reqs, HashSet<String> exports)
-    {
-        for (IBldBundle bundle : getBundles())
-        {
-            for (IPackageExport export : bundle.getExports())
-            {
-                exports.add(export.getPackageName());
-            }
-        }
-    }
-
-    /**
-     * @param reqs
-     * @throws IOException 
-     */
-    private void parseRequires(BundleModelElement reqs) throws IOException
-    {
-        Map<String, Map<String, String>> requires = config.getMap(null,
-            BldConfig.M_REQUIRES);
-        Properties bundleDefaults = config.getProps(null, BldConfig.P_BUNDLE_VERSION);
-
-        if (requires != null)
-        {
-            for (String name : requires.keySet())
-            {
-                Map<String, String> attr = requires.get(name);
-                String versions = attr.containsKey(BldAttr.VERSION_ATTRIBUTE) ? attr.get(BldAttr.VERSION_ATTRIBUTE)
-                    : bundleDefaults.getProperty(name);
-                String resolution = attr.get(BldAttr.RESOLUTION_ATTRIBUTE);
-
-                RequiredBundle rb = new RequiredBundle();
-                rb.setSymbolicName(name);
-                rb.setVersions(VersionRange.parseVersionRange(versions));
-
-                if (BldAttr.RESOLUTION_OPTIONAL.equals(resolution))
-                {
-                    rb.setOptional(true);
-                }
-                else if (resolution != null)
-                {
-                    throw new IOException("Bad attribute value: "
-                        + BldAttr.RESOLUTION_ATTRIBUTE + "=" + resolution);
-                }
-
-                reqs.addRequiredBundle(rb);
-            }
-        }
-
-        for (IBldBundle bundle : getBundles())
-        {
-            IRequiredBundle fh = bundle.getFragmentHost();
-            if (fh != null)
-                reqs.addRequiredBundle(fh);
-        }
-    }
-
-    /**
-     * @param reqs 
-     * @param exports 
-     * @param sourceContents 
-     * @throws IOException 
-     * 
-     */
-    private void parseImports(BundleModelElement reqs, List<String> sourceContents,
-        HashSet<String> exports) throws IOException
-    {
-        Map<String, Map<String, String>> imports = config.getMap(null,
-            BldConfig.M_IMPORTS);
-
-        for (String name : imports.keySet())
-        {
-            Map<String, String> attr = imports.get(name);
-
-            String resolve = attr.get(BldAttr.RESOLVE_ATTRIBUTE);
-            String resolution = attr.get(BldAttr.RESOLUTION_ATTRIBUTE);
-            String versions = attr.containsKey(BldAttr.VERSION_ATTRIBUTE) ? attr.get(BldAttr.VERSION_ATTRIBUTE)
-                : getDefaultPackageVersion(name);
-
-            PackageImport pi = new PackageImport();
-            pi.setPackageName(name);
-
-            // avoid dependency on self-exports
-            // XXX: BldConverter.setBundle contains similar logic
-            if (exports.contains(name)
-                && (sourceContents.contains(name) || sourceContents.isEmpty()))
-            {
-                pi.setDependency(false);
-                if (versions == null)
-                    versions = getVersion();
-            }
-
-            if (!checkVersionRange(versions))
-            {
-                throw new IOException("Failed to parse version range for " + resolve
-                    + " missing \"'s around version range?");
-            }
-
-            pi.setVersions(VersionRange.parseVersionRange(versions));
-
-            if (BldAttr.RESOLUTION_OPTIONAL.equals(resolution))
-            {
-                pi.setOptional(true);
-            }
-            else if (resolution != null)
-            {
-                throw new IOException("Bad attribute value: "
-                    + BldAttr.RESOLUTION_ATTRIBUTE + "=" + resolution);
-            }
-
-            setResolve(pi, resolve);
-
-            reqs.addImport(pi);
-        }
-    }
-
-    private boolean checkVersionRange(String versions)
-    {
-        if (versions == null || versions.length() == 0)
-        {
-            return true;
-        }
-        else
-        {
-            switch (versions.charAt(0))
-            {
-                case '(':
-                case '[':
-                    switch (versions.charAt(versions.length() - 1))
-                    {
-                        case ')':
-                        case ']':
-                            return true;
-                        default:
-                            return false;
-                    }
-                default:
-                    return true;
-            }
-        }
-    }
-
-    public List<String> getBundleIds()
-    {
-        List<String> ids = config.getList(null, BldConfig.C_BUNDLES);
-        if (ids == null)
-            return Collections.emptyList();
-        return ids;
-    }
-
-    public List<IBldBundle> getBundles()
-    {
-        ArrayList<IBldBundle> list = new ArrayList<IBldBundle>();
-
-        for (String id : getBundleIds())
-        {
-            list.add(new BldBundle(id));
-        }
-
-        return list;
-    }
-
-    public List<String> getRepositoryPath() 
-    {
-        List<String> ids = config.getList(null, BldConfig.C_REPOSITORY_PATH);
-        
-        if (ids.isEmpty())
-            return Collections.singletonList(IRepositoryConfig.WILD_CARD);
-        
-        return ids;
-    }
-    
-    public Properties getRepositoryConfig(String name)
-    {
-        BldProperties bp = new BldProperties(baseDir, bldOverrides);
-
-        Properties repo = config.getProps(null, name);
-
-        if ( repo.isEmpty() ) {
-            // XXX getProps returns and empty props vs null if not found?
-            return null;
-        }
-        
-        for (Object k : repo.keySet())
-        {
-            String key = (String) k;
-            String value = repo.getProperty(key);
-            repo.setProperty(key, BldUtil.expand(value, bp));
-        }
-        
-        return repo;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getAllRepositories()
-     */
-    public List<String> getAllRepositories()
-    {
-        return config.getList(null, BldConfig.C_REPOSITORIES);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryDefinition(java.lang.String)
-     */
-    public URI getRepositoryDefinition(String name)
-    {
-        return config.getDefinition(null, name);
-    }    
-
-    public Properties getOptions()
-    {
-        return config.getProps(null, BldConfig.P_OPTION);
-    }
-
-    public Properties getDefaultPackageVersions()
-    {
-        return config.getProps(null, BldConfig.P_PACKAGE_VERSION);
-    }
-
-    public ISigilBundle getDefaultBundle()
-    {
-        List<String> bundles = getBundleIds();
-        if (bundles.isEmpty())
-            return null;
-
-        String id = bundles.get(0);
-        return getSigilBundle(id);
-    }
-
-    public ISigilBundle getSigilBundle(String id)
-    {
-        BldBundle bundle = new BldBundle(id);
-        return convert.getBundle(id, bundle);
-    }
-
-    public void setDefaultBundle(ISigilBundle bundle)
-    {
-        setSigilBundle(null, bundle);
-    }
-
-    public void setSigilBundle(String id, ISigilBundle bundle)
-    {
-        List<String> ids = getBundleIds();
-
-        if (ids.isEmpty())
-        {
-            ArrayList<String> list = new ArrayList<String>();
-            list.add(id == null ? bundle.getBundleInfo().getSymbolicName() : id);
-            config.setList(null, BldConfig.C_BUNDLES, list);
-        }
-        else if (id == null)
-        {
-            id = ids.get(0);
-        }
-        else if (!ids.contains(id))
-        {
-            List<String> list = config.getList(null, BldConfig.C_BUNDLES);
-            list.add(id);
-            config.setList(null, BldConfig.C_BUNDLES, list);
-        }
-
-        if (ids.size() == 1)
-            id = null; // don't prefix default bundle with id
-
-        convert.setBundle(id, bundle);
-    }
-
-    public void save() throws IOException
-    {
-        saveAs(new File(loc));
-    }
-
-    public void saveAs(File path) throws IOException
-    {
-        File part = new File(path.getPath() + ".part");
-        saveTo(new FileOutputStream((part)));
-
-        path.delete();
-        if (!part.renameTo(path))
-            throw new IOException("failed to rename " + part + " to " + path);
-    }
-
-    public void saveTo(OutputStream out)
-    {
-        PrintWriter writer = new PrintWriter(new OutputStreamWriter(out));
-        config.write(writer);
-        writer.close();
-    }
-
-    public List<String> getSourceDirs()
-    {
-        List<String> list = config.getList(null, BldConfig.L_SRC_CONTENTS);
-        return list != null ? list : Collections.<String> emptyList();
-    }
-
-    public List<String> getSourcePkgs()
-    {
-        if (sourcePkgs == null)
-        {
-            sourcePkgs = new ArrayList<String>();
-            for (String src : getSourceDirs())
-            {
-                File dir = resolve(src);
-                if (!dir.isDirectory())
-                {
-                    System.err.println("WARN: sourcedir does not exist: " + dir);
-                    continue;
-                    // throw new RuntimeException("sourcedir: " + dir +
-                    // " : is not a directory.");
-                }
-                findSrcPkgs(dir, null, sourcePkgs);
-            }
-        }
-
-        return sourcePkgs;
-    }
-
-    private void findSrcPkgs(File dir, String pkg, List<String> result)
-    {
-        ArrayList<File> dirs = new ArrayList<File>();
-        boolean found = false;
-
-        for (String name : dir.list())
-        {
-            if (name.endsWith(".java"))
-            {
-                found = true;
-            }
-            else if (!name.equals(".svn"))
-            {
-                File d = new File(dir, name);
-                if (d.isDirectory())
-                    dirs.add(d);
-            }
-        }
-
-        if (pkg == null)
-        {
-            pkg = "";
-        }
-        else if (pkg.equals(""))
-        {
-            pkg = dir.getName();
-        }
-        else
-        {
-            pkg = pkg + "." + dir.getName();
-        }
-
-        if (found)
-            result.add(pkg);
-
-        for (File d : dirs)
-            findSrcPkgs(d, pkg, result);
-    }
-    
-    public BldProject clone() {
-        BldProject p;
-        try
-        {
-            p = (BldProject) super.clone();
-            p.config = p.config.clone();
-            p.convert = new BldConverter(p.config);
-            p.requirements = p.requirements == null ? null : p.requirements.clone();
-        }
-        catch (CloneNotSupportedException e)
-        {
-            throw new IllegalStateException(e);
-        }
-        return p;
-    }
-
-    /**
-     * BldBundle
-     * 
-     */
-    class BldBundle implements IBldBundle
-    {
-        private String id;
-
-        public BldBundle(String id)
-        {
-            this.id = id;
-        }
-
-        public File resolve(String path)
-        {
-            return BldProject.this.resolve(path);
-        }
-
-        private String getString(String key)
-        {
-            return config.getString(id, key);
-        }
-
-        private boolean getBoolean(String key)
-        {
-            return Boolean.parseBoolean(getString(key));
-        }
-
-        private List<String> getList(String key)
-        {
-            List<String> list = config.getList(id, key);
-            return list != null ? list : Collections.<String> emptyList();
-        }
-
-        private Map<String, Map<String, String>> getMap(String key)
-        {
-            Map<String, Map<String, String>> map = config.getMap(id, key);
-            return map != null ? map
-                : Collections.<String, Map<String, String>> emptyMap();
-        }
-
-        public String getActivator()
-        {
-            return getString(BldConfig.S_ACTIVATOR);
-        }
-
-        public String getId()
-        {
-            String name = getString("id");
-            return name != null ? name : id;
-        }
-
-        public String getVersion()
-        {
-            String ver = getString(BldConfig.S_VERSION);
-            if (ver == null)
-            {
-                ver = BldProject.this.getVersion();
-            }
-            return ver;
-        }
-
-        public String getSymbolicName()
-        {
-            String name = getString(BldConfig.S_SYM_NAME);
-            return name != null ? name : getId();
-        }
-
-        public boolean isSingleton()
-        {
-            return getBoolean(BldConfig.S_SINGLETON);
-        }
-
-        public List<IPackageExport> getExports()
-        {
-            ArrayList<IPackageExport> list = new ArrayList<IPackageExport>();
-            Map<String, Map<String, String>> exports = getMap(BldConfig.M_EXPORTS);
-
-            if (exports != null)
-            {
-                for (String name : exports.keySet())
-                {
-                    Map<String, String> attrs = exports.get(name);
-                    PackageExport pkgExport = new PackageExport();
-                    pkgExport.setPackageName(name);
-
-                    String version = attrs.get(BldAttr.VERSION_ATTRIBUTE);
-                    // only default export version from local packages
-                    if (version == null
-                        && (getSourcePkgs().isEmpty() || getSourcePkgs().contains(name)))
-                    {
-                        version = getVersion();
-                    }
-
-                    if (version != null)
-                        pkgExport.setVersion(VersionTable.getVersion(version));
-
-                    list.add(pkgExport);
-                }
-            }
-
-            return list;
-        }
-
-        public List<IPackageImport> getImports()
-        {
-            ArrayList<IPackageImport> list = new ArrayList<IPackageImport>();
-
-            for (IPackageImport import1 : getRequirements().childrenOfType(
-                IPackageImport.class))
-            {
-                list.add(import1);
-            }
-
-            return list;
-        }
-
-        public List<IRequiredBundle> getRequires()
-        {
-            ArrayList<IRequiredBundle> list = new ArrayList<IRequiredBundle>();
-            list.addAll(Arrays.asList(getRequirements().childrenOfType(
-                IRequiredBundle.class)));
-
-            for (IBldBundle bundle : getBundles())
-            {
-                IRequiredBundle fh = bundle.getFragmentHost();
-                if (fh != null)
-                    list.remove(fh);
-            }
-
-            return list;
-        }
-
-        public IRequiredBundle getFragmentHost()
-        {
-            IRequiredBundle fragment = null;
-            Map<String, Map<String, String>> fragments = getMap(BldConfig.M_FRAGMENT);
-            if (fragments != null)
-            {
-                for (String name : fragments.keySet())
-                {
-                    Map<String, String> attr = fragments.get(name);
-                    String versions = attr.isEmpty() ? null
-                        : attr.get(BldAttr.VERSION_ATTRIBUTE);
-                    fragment = new RequiredBundle();
-                    fragment.setSymbolicName(name);
-                    fragment.setVersions(VersionRange.parseVersionRange(versions));
-                    break;
-                }
-            }
-
-            return fragment;
-        }
-
-        public Map<String, Map<String, String>> getLibs()
-        {
-            Map<String, Map<String, String>> libs = getMap(BldConfig.M_LIBS);
-            return (libs != null) ? libs
-                : Collections.<String, Map<String, String>> emptyMap();
-        }
-
-        public List<String> getContents()
-        {
-            return getList(BldConfig.L_CONTENTS);
-        }
-
-        public List<Resource> getResources()
-        {
-            List<String> resources = getList(BldConfig.L_RESOURCES);
-            if (resources == null)
-            {
-                return Collections.emptyList();
-            }
-
-            List<Resource> ret = new ArrayList<Resource>(resources.size());
-            for (String resource : resources)
-            {
-                ret.add(newResource(resource));
-            }
-            return ret;
-        }
-
-        public Properties getHeaders()
-        {
-            Properties headers = config.getProps(id, BldConfig.P_HEADER);
-            return headers;
-        }
-
-    }
-
-    public long getLastModified()
-    {
-        return lastModified;
-    }
-    
-    @Override
-    public String toString() {
-        return config.toString();
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldProperties.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/BldProperties.java
deleted file mode 100644
index a923f31..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldProperties.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Properties;
-
-public class BldProperties extends Properties
-{
-    private static final long serialVersionUID = 1L;
-    private static final BldProperties global = new BldProperties(null, null);
-    private static final Properties sysEnv;
-
-    static
-    {
-        Properties env = new Properties();
-        env.putAll(System.getenv());
-        sysEnv = new Properties(env);
-        sysEnv.putAll(System.getProperties());
-        // Note: these are System properties, NOT Ant properties.
-    }
-
-    private final Properties mySysEnv;
-
-    BldProperties(File baseDir, Properties overrides)
-    {
-        mySysEnv = new Properties(sysEnv);
-
-        if (overrides != null)
-        {
-            mySysEnv.putAll(overrides);
-        }
-
-        try
-        {
-            if (baseDir != null)
-            {
-                mySysEnv.setProperty(".", baseDir.getCanonicalPath());
-                mySysEnv.setProperty("..", baseDir.getParentFile().getCanonicalPath());
-            }
-        }
-        catch (IOException e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    public String getProperty(String key, String defaultValue)
-    {
-        return mySysEnv.getProperty(key, defaultValue);
-    }
-
-    public String getProperty(String key)
-    {
-        return mySysEnv.getProperty(key);
-    }
-
-    public static Properties global()
-    {
-        return global;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldUtil.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/BldUtil.java
deleted file mode 100644
index f51c386..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/BldUtil.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config;
-
-import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class BldUtil
-{
-    /**
-     * expands property references embedded in strings. Each occurrence of ${name} is replaced with the value of
-     * p.getProperty("name"); If the property is not set, then the original reference, is returned as follows "?<name>".
-     * 
-     * Strings to be expanded should not contain $ or }, except to indicate expansions.
-     * 
-     * Value is expanded recursively and so can contain further ${name} references. Also supports shell-expansions
-     * ${name:-value}, ${name:=value} and ${name:+value}.
-     * 
-     * <pre>
-     *      ${parameter}
-     *      The value of parameter is substituted.
-     *      ${parameter:-word}
-     *      Use  Default  Values.  If parameter is null, the expansion of word
-     *      is substituted.  Otherwise, the value of  parameter is substituted.
-     *      ${parameter:=word}
-     *      Assign  Default  Values.   If  parameter is null, the expansion of
-     *      word is assigned to parameter.  The value of parameter  is  then
-     *      substituted.
-     *      ${parameter:+word}
-     *      Use Alternate Value.  If parameter is null, nothing  is
-     *      substituted, otherwise the expansion of word is substituted.
-     *      ${parameter:?word}
-     *      Raise Error.  If parameter is null, a RuntimeException is thown,
-     *      with word as the message.
-     * </pre>
-     */
-    public static String expand(String s, Properties p)
-    {
-        // regex to match property references e.g. ${name}
-        // TODO this is very simplistic, so strings to be expanded should not
-        // contain $ or }, except where substitution is expected.
-        // Update: propRef regex now allows substitutions to contain $,
-        // e.g. where a Windows ${user.name} is $Admin or similar.
-        final Pattern propRef = Pattern.compile("\\$\\{(((\\$[^\\{\\}])|[^\\$\\}])+\\$?)\\}");
-        final Pattern backslash = Pattern.compile("\\\\");
-        final Pattern dollar = Pattern.compile("\\$");
-
-        if (s == null)
-        {
-            return null;
-        }
-
-        if (s.indexOf("${") == -1)
-        { // shortcut if no expansions
-            return s;
-        }
-
-        for (int i = 0; i < 20; i++)
-        { // avoids self-referencing expansions
-            // System.out.println("XXX expand[" + i + "] = [" + s + "]");
-            Matcher matcher = propRef.matcher(s);
-
-            if (!matcher.find())
-            {
-                // replace unmatched items
-                s = s.replaceAll("\\Q??[\\E", "\\${");
-                s = s.replaceAll("\\Q??]\\E", "}");
-                // debug("expanded: " + s);
-                if (s.indexOf("${") != -1)
-                {
-                    throw new RuntimeException("Can't expand: " + s);
-                }
-                return s;
-            }
-
-            String key = matcher.group(1);
-            String[] keydef = key.split(":[=+-?@]", 2);
-            String replace;
-
-            if (keydef.length != 2)
-            {
-                replace = key.length() == 0 ? null : p.getProperty(key);
-            }
-            else
-            {
-                replace = keydef[0].length() == 0 ? null : p.getProperty(keydef[0]);
-
-                if (replace != null
-                    && (replace.length() == 0 || replace.indexOf("${") != -1))
-                {
-                    // don't want unexpanded replacement, as it may stop ${...:-default}
-                    replace = null;
-                }
-
-                if (key.indexOf(":+") != -1)
-                {
-                    replace = ((replace == null) ? "" : keydef[1]);
-                }
-                else if (replace == null)
-                {
-                    replace = keydef[1];
-
-                    if (key.indexOf(":?") != -1)
-                    {
-                        String msg = "${" + keydef[0] + ":?" + keydef[1]
-                            + "} property not set";
-                        throw new RuntimeException(msg);
-                    }
-
-                    if (key.indexOf(":=") != -1)
-                    {
-                        p.setProperty(keydef[0], keydef[1]);
-                    }
-                }
-            }
-
-            if (replace == null)
-            {
-                // TODO: this is a hack to avoid looping on unmatched references
-                // should really leave unchanged and process rest of string.
-                // We use "]" as delimiter to avoid non-matched "}"
-                // terminating potential _propRef match
-                replace = "??[" + key + "??]";
-            }
-
-            // Excerpt from replaceAll() javadoc:
-            //
-            // Note that backslashes (\) and dollar signs ($) in the replacement
-            // string may cause the results to be different than if it were
-            // being
-            // treated as a literal replacement string. Dollar signs may be
-            // treated
-            // as references to captured subsequences, and backslashes are used
-            // to
-            // escape literal characters in the replacement string.
-            // escape any \ or $ in replacement string
-            replace = backslash.matcher(replace).replaceAll("\\\\\\\\");
-            replace = dollar.matcher(replace).replaceAll("\\\\\\$");
-
-            s = s.replaceAll("\\Q${" + key + "}\\E", replace);
-        }
-
-        throw new RuntimeException("expand: loop expanding: " + s);
-    }
-
-    public static String expand(String s)
-    {
-        return expand(s, BldProperties.global());
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/IBldProject.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/IBldProject.java
deleted file mode 100644
index d7838c1..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/IBldProject.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.sigil.common.config;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-
-public interface IBldProject
-{
-
-    static final String PROJECT_FILE = "sigil.properties";
-    static final String PROJECT_DEFAULTS = "../sigil-defaults.properties";
-
-    void save() throws IOException;
-
-    void saveAs(File path) throws IOException;
-
-    void saveTo(OutputStream out) throws IOException;
-
-    /**
-     * gets default package version ranges.
-     */
-    Properties getDefaultPackageVersions();
-
-    /**
-     * gets default package version range for named package.
-     * Also handles wildcards in defaults.
-     */
-    String getDefaultPackageVersion(String name);
-
-    /**
-     * get project options.
-     */
-    Properties getOptions();
-
-    /**
-     * get project version.
-     */
-    String getVersion();
-
-    /**
-     * gets dependencies (Package-Import and Require-Bundle) needed to compile.
-     */
-    IBundleModelElement getDependencies();
-
-    /**
-     * gets project source directories.
-     * This is a convenient way to specify bundle contents
-     * when the project doesn't contains multiple bundles.
-     */
-    List<String> getSourceDirs();
-
-    /**
-     * gets the list of packages represented by getSourceDirs().
-     * @throws IOException 
-     */
-    List<String> getSourcePkgs();
-
-    /**
-     * gets bundle ids.
-     */
-    List<String> getBundleIds();
-
-    /**
-     * gets bundles.
-     */
-    List<IBldBundle> getBundles();
-
-    /**
-     * convert specified bundle to SigilBundle.
-     */
-    ISigilBundle getSigilBundle(String id);
-
-    /**
-     * convert SigilBundle to specified bundle.
-     */
-    void setSigilBundle(String id, ISigilBundle sb);
-
-    /**
-     * converts default bundle to SigilBundle.
-     */
-    ISigilBundle getDefaultBundle();
-
-    /**
-     * converts SigilBundle to default bundle.
-     */
-    void setDefaultBundle(ISigilBundle sb);
-
-    /**
-     * resolves a relative path against the project file location.
-     */
-    File resolve(String path);
-
-    /**
-     * Creates a new resource for this bundle
-     * @param location
-     * @return
-     */
-    Resource newResource(String location);
-
-    /**
-     * gets the last modification date of the project file.
-     */
-    long getLastModified();
-    
-    IBldProject clone();
-
-    interface IBldBundle
-    {
-        /**
-         * gets bundle activator
-         */
-        String getActivator();
-
-        /**
-         * gets bundle id within project.
-         */
-        String getId();
-
-        /**
-         * gets bundle version.
-         */
-        String getVersion();
-
-        /**
-         * gets the Bundle-SymbolicName.
-         */
-        String getSymbolicName();
-
-        /**
-         * gets bundles export-packages.
-         */
-        List<IPackageExport> getExports();
-
-        /**
-         * gets project import-packages. 
-         */
-        List<IPackageImport> getImports();
-
-        /**
-         * gets project require-bundles. 
-         */
-        List<IRequiredBundle> getRequires();
-
-        /**
-         * get bundle fragment-host. 
-         */
-        IRequiredBundle getFragmentHost();
-
-        /**
-         * gets bundle libs. 
-         */
-        Map<String, Map<String, String>> getLibs();
-
-        /**
-         * gets the bundle contents
-         * @return list of package patterns.
-         */
-        List<String> getContents();
-
-        /**
-         * gets the additional resources.
-         * @return map with key as path in bundle, value as path in file system.
-         * Paths are resolved relative to location of project file and also from classpath.
-         */
-        List<Resource> getResources();
-
-        /**
-         * gets additional bundle headers.
-         */
-        Properties getHeaders();
-
-        /**
-         * resolves a relative path against the project file location.
-         */
-        File resolve(String path);
-
-        /**
-         * @return
-         */
-        boolean isSingleton();
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/IRepositoryConfig.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/IRepositoryConfig.java
deleted file mode 100644
index 79a8de7..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/IRepositoryConfig.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config;
-
-import java.net.URI;
-import java.util.List;
-import java.util.Properties;
-
-public interface IRepositoryConfig
-{
-    static final String REPOSITORY_PROVIDER = "provider";
-    static final String WILD_CARD = "*";
-    
-    URI getRepositoryDefinition(String name);
-    
-    /**
-     * Return the ordered list of repositories to search
-     * for dependencies.
-     * 
-     * @return
-     */
-    List<String> getRepositoryPath();
-
-    /**
-     * get properties with which to instantiate repositories.
-     * The key REPOSITORY_PROVIDER will be set to the fully qualified class name of the IRepositoryProvider.
-     * @return
-     */
-    Properties getRepositoryConfig(String name);
-
-    /**
-     * @return
-     */
-    List<String> getAllRepositories();
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/Resource.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/Resource.java
deleted file mode 100644
index 19183a6..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/Resource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config;
-
-import java.io.File;
-
-/**
- * @author dave
- *
- */
-public interface Resource
-{
-    String toBNDInstruction(File[] classpath);
-
-    /**
-     * @return
-     */
-    String getLocalFile();
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/AbstractResource.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/AbstractResource.java
deleted file mode 100644
index 40d9dba..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/AbstractResource.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config.internal;
-
-import java.io.File;
-
-import org.apache.felix.sigil.common.config.IBldProject;
-import org.apache.felix.sigil.common.config.Resource;
-
-/**
- * @author dave
- *
- */
-public abstract class AbstractResource implements Resource
-{
-    protected final String bPath;
-    protected final IBldProject project;
-
-    protected AbstractResource(IBldProject project, String bPath)
-    {
-        if (bPath == null)
-            throw new NullPointerException();
-
-        if (project == null)
-            throw new NullPointerException();
-
-        this.bPath = bPath;
-        this.project = project;
-    }
-
-    protected String findFileSystemPath(String fsPath, File[] classpath)
-    {
-        File resolved = project.resolve(fsPath);
-
-        // fsPath may contain Bnd variable, making path appear to not exist
-
-        if (!resolved.exists())
-        {
-            // Bnd already looks for classpath jars
-            File found = findInClasspathDir(fsPath, classpath);
-            if (found != null)
-            {
-                fsPath = found.getPath();
-            }
-            else
-            {
-                fsPath = resolved.getAbsolutePath();
-            }
-        }
-        else
-        {
-            fsPath = resolved.getAbsolutePath();
-        }
-
-        return fsPath;
-    }
-
-    private File findInClasspathDir(String file, File[] classpath)
-    {
-        for (File cp : classpath)
-        {
-            if (cp.isDirectory())
-            {
-                File path = new File(cp, file);
-                if (path.exists())
-                {
-                    return path;
-                }
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/InlineResource.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/InlineResource.java
deleted file mode 100644
index 7d23bf5..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/InlineResource.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config.internal;
-
-import java.io.File;
-
-import org.apache.felix.sigil.common.config.IBldProject;
-
-/**
- * @author dave
- *
- */
-public class InlineResource extends AbstractResource
-{
-
-    /**
-     * @param bPath
-     */
-    public InlineResource(IBldProject project, String bPath)
-    {
-        super(project, bPath);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.core.Resource#getLocalFile()
-     */
-    public String getLocalFile()
-    {
-        return bPath;
-    }
-
-    public String toString()
-    {
-        return '@' + bPath;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.core.Resource#toBNDInstruction(java.io.File[])
-     */
-    public String toBNDInstruction(File[] classpath)
-    {
-        StringBuilder sb = new StringBuilder();
-        sb.append('@');
-
-        File f = project.resolve(bPath);
-
-        if (f.exists())
-        {
-            sb.append(f);
-        }
-        else
-            sb.append(bPath);
-
-        return sb.toString();
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/PreprocessedResource.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/PreprocessedResource.java
deleted file mode 100644
index c4672a5..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/PreprocessedResource.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.sigil.common.config.internal;
-
-import java.io.File;
-
-import org.apache.felix.sigil.common.config.IBldProject;
-
-/**
- * @author dave
- *
- */
-public class PreprocessedResource extends AbstractResource
-{
-    private final String fsPath;
-
-    public PreprocessedResource(IBldProject project, String bPath, String fsPath)
-    {
-        super(project, bPath);
-        this.fsPath = fsPath;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.core.Resource#getLocalFile()
-     */
-    public String getLocalFile()
-    {
-        return fsPath == null ? bPath : fsPath;
-    }
-
-    @Override
-    public String toString()
-    {
-        StringBuilder sb = new StringBuilder();
-        sb.append('{');
-        sb.append(bPath);
-        if (fsPath != null)
-        {
-            sb.append('=');
-            sb.append(fsPath);
-        }
-        sb.append('}');
-        return sb.toString();
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.core.Resource#toBNDInstruction(java.io.File[])
-     */
-    public String toBNDInstruction(File[] classpath)
-    {
-        StringBuilder sb = new StringBuilder();
-        String fsp = fsPath;
-        if (fsp == null)
-            fsp = bPath;
-
-        fsp = findFileSystemPath(fsp, classpath);
-
-        sb.append('{');
-        sb.append(bPath);
-        sb.append('=');
-        sb.append(fsp);
-        sb.append('}');
-
-        return sb.toString();
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/StandardResource.java b/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/StandardResource.java
deleted file mode 100644
index 39c6130..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/config/internal/StandardResource.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.config.internal;
-
-import java.io.File;
-
-import org.apache.felix.sigil.common.config.IBldProject;
-
-/**
- * @author dave
- *
- */
-public class StandardResource extends AbstractResource
-{
-    private final String fsPath;
-
-    /**
-     * @param bldProject 
-     * @param bPath2
-     * @param fsPath2
-     */
-    public StandardResource(IBldProject project, String bPath, String fsPath)
-    {
-        super(project, bPath);
-        this.fsPath = fsPath;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.core.Resource#getLocalFile()
-     */
-    public String getLocalFile()
-    {
-        return fsPath == null ? bPath : fsPath;
-    }
-
-    @Override
-    public String toString()
-    {
-        StringBuilder sb = new StringBuilder();
-        sb.append(bPath);
-        if (fsPath != null)
-        {
-            sb.append('=');
-            sb.append(fsPath);
-        }
-        return sb.toString();
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.core.Resource#toBNDInstruction(java.io.File[])
-     */
-    public String toBNDInstruction(File[] classpath)
-    {
-        StringBuilder sb = new StringBuilder();
-        String fsp = fsPath;
-        if (fsp == null)
-            fsp = bPath;
-
-        fsp = findFileSystemPath(fsp, classpath);
-
-        sb.append(bPath);
-        sb.append('=');
-        sb.append(fsp);
-
-        return sb.toString();
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/BldCore.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/BldCore.java
deleted file mode 100644
index d8d6013..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/BldCore.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.felix.sigil.common.core.internal.license.LicenseManager;
-import org.apache.felix.sigil.common.core.internal.model.eclipse.Library;
-import org.apache.felix.sigil.common.core.internal.model.eclipse.LibraryImport;
-import org.apache.felix.sigil.common.core.internal.model.eclipse.SigilBundle;
-import org.apache.felix.sigil.common.core.internal.model.osgi.BundleModelElement;
-import org.apache.felix.sigil.common.core.internal.model.osgi.PackageExport;
-import org.apache.felix.sigil.common.core.internal.model.osgi.PackageImport;
-import org.apache.felix.sigil.common.core.internal.model.osgi.RequiredBundle;
-import org.apache.felix.sigil.common.core.licence.ILicenseManager;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ILibrary;
-import org.apache.felix.sigil.common.model.eclipse.ILibraryImport;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class BldCore implements BundleActivator
-{
-    private static LicenseManager licenceManager = new LicenseManager();
-
-    private static final Logger log = Logger.getLogger(BldCore.class.getName());
-
-    public static void error(String string, Throwable e)
-    {
-        // TODO 
-        log.log(Level.WARNING, string, e);
-    }
-
-    public static void error(String string)
-    {
-        log.log(Level.WARNING, string);
-    }
-
-    public static ILicenseManager getLicenseManager()
-    {
-        return licenceManager;
-    }
-
-    public void start(BundleContext context) throws Exception
-    {
-        init();
-    }
-
-    public static void init() throws Exception
-    {
-        ModelElementFactory.getInstance().register(ISigilBundle.class, SigilBundle.class,
-            "bundle", "sigil", null);
-        ModelElementFactory.getInstance().register(ILibrary.class, Library.class,
-            "library", "sigil", null);
-        ModelElementFactory.getInstance().register(ILibraryImport.class,
-            LibraryImport.class, "library-import", "sigil", null);
-
-        // osgi elements
-        ModelElementFactory.getInstance().register(IBundleModelElement.class,
-            BundleModelElement.class, "bundle", null, null);
-        ModelElementFactory.getInstance().register(IPackageExport.class,
-            PackageExport.class, "package.export", null, null);
-        ModelElementFactory.getInstance().register(IPackageImport.class,
-            PackageImport.class, "package.import", null, null);
-        ModelElementFactory.getInstance().register(IRequiredBundle.class,
-            RequiredBundle.class, "required.bundle", null, null);
-    }
-
-    public void stop(BundleContext context) throws Exception
-    {
-        // TODO Auto-generated method stub
-
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/license/LicenseManager.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/license/LicenseManager.java
deleted file mode 100644
index 0d6b444..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/license/LicenseManager.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.internal.license;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import org.apache.felix.sigil.common.core.licence.ILicenseManager;
-import org.apache.felix.sigil.common.core.licence.ILicensePolicy;
-
-public class LicenseManager implements ILicenseManager
-{
-
-    private HashMap<String, Pattern> licenses = new HashMap<String, Pattern>();
-    private HashMap<String, LicensePolicy> policies = new HashMap<String, LicensePolicy>();
-    private LicensePolicy defaultPolicy = new LicensePolicy(this);
-
-    public void addLicense(String name, Pattern pattern)
-    {
-        licenses.put(name, pattern);
-    }
-
-    public void removeLicense(String name)
-    {
-        licenses.remove(name);
-    }
-
-    public Set<String> getLicenseNames()
-    {
-        return Collections.unmodifiableSet(licenses.keySet());
-    }
-
-    public Pattern getLicensePattern(String name)
-    {
-        return licenses.get(name);
-    }
-
-    public ILicensePolicy getDefaultPolicy()
-    {
-        return defaultPolicy;
-    }
-
-    //public ILicensePolicy getPolicy(ISigilProjectModel project) {
-    //	synchronized( policies ) {
-    //		LicensePolicy p = policies.get(project.getName());
-    //		
-    //		if ( p == null ) {
-    //			p = new LicensePolicy(this, project);
-    //			policies.put( project.getName(), p );
-    //		}
-    //		
-    //		return p;
-    //	}
-    //}
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/license/LicensePolicy.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/license/LicensePolicy.java
deleted file mode 100644
index 06eefd3..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/license/LicensePolicy.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.internal.license;
-
-import org.apache.felix.sigil.common.core.licence.ILicensePolicy;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.progress.IProgress;
-
-public class LicensePolicy implements ILicensePolicy
-{
-
-    private LicenseManager licenseManager;
-
-    public LicensePolicy(LicenseManager licenseManager)
-    {
-        this.licenseManager = licenseManager;
-    }
-
-    public boolean accept(ISigilBundle bundle)
-    {
-        return true;
-    }
-
-    public void addAllowed(String licenseName)
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    public void removeAllowed(String licenseName)
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    public void save(IProgress progress)
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/BundleCapability.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/BundleCapability.java
deleted file mode 100644
index 6799420..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/BundleCapability.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.common.core.internal.model.eclipse;
-
-import org.apache.felix.sigil.common.model.AbstractModelElement;
-import org.apache.felix.sigil.common.model.eclipse.IBundleCapability;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.osgi.framework.Version;
-
-public class BundleCapability extends AbstractModelElement implements IBundleCapability
-{
-
-    private final String bsn;
-    private final Version version;
-
-    public BundleCapability(IBundleModelElement bundle)
-    {
-        super("Bundle Capability");
-        this.bsn = bundle.getSymbolicName();
-        this.version = bundle.getVersion();
-        setParent(bundle.getParent());
-    }
-
-    public String getSymbolicName()
-    {
-        return bsn;
-    }
-
-    public Version getVersion()
-    {
-        return version;
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (obj == this)
-            return true;
-        if (obj == null)
-            return false;
-
-        if (obj instanceof BundleCapability)
-        {
-            BundleCapability bc = (BundleCapability) obj;
-            return (bsn == null ? bc.bsn == null : bsn.equals(bc.bsn))
-                && (version == null ? bc.version == null : version.equals(bc.version));
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode()
-    {
-        int hc = 11;
-
-        if (bsn != null)
-        {
-            hc *= bsn.hashCode();
-        }
-
-        if (version != null)
-        {
-            hc *= version.hashCode();
-        }
-
-        return hc;
-    }
-    
-    @Override
-    public String toString() {
-        return "BundleCapability[" + bsn + ":version=" + version + "]";
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/Library.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/Library.java
deleted file mode 100644
index 0e16bc5..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/Library.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.internal.model.eclipse;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.AbstractCompoundModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ILibrary;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.osgi.framework.Version;
-
-public class Library extends AbstractCompoundModelElement implements ILibrary
-{
-
-    private static final long serialVersionUID = 1L;
-
-    private String name;
-    private Version version;
-    private Set<IRequiredBundle> bundles;
-    private Set<IPackageImport> imports;
-
-    public Library()
-    {
-        super("Library");
-        bundles = new HashSet<IRequiredBundle>();
-        imports = new HashSet<IPackageImport>();
-    }
-
-    public void addBundle(IRequiredBundle bundle)
-    {
-        bundles.add(bundle);
-    }
-
-    public void addImport(IPackageImport pi)
-    {
-        imports.add(pi);
-    }
-
-    public Collection<IRequiredBundle> getBundles()
-    {
-        return bundles;
-    }
-
-    public Collection<IPackageImport> getImports()
-    {
-        return imports;
-    }
-
-    public String getName()
-    {
-        return name;
-    }
-
-    public Version getVersion()
-    {
-        return version;
-    }
-
-    public void removeBundle(IRequiredBundle bundle)
-    {
-        bundles.remove(bundle);
-    }
-
-    public void removeImport(IPackageImport pi)
-    {
-        imports.remove(pi);
-    }
-
-    public void setName(String name)
-    {
-        this.name = name;
-    }
-
-    public void setVersion(Version version)
-    {
-        this.version = version;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/LibraryImport.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/LibraryImport.java
deleted file mode 100644
index 9f2e863..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/LibraryImport.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.internal.model.eclipse;
-
-import org.apache.felix.sigil.common.model.AbstractModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ILibraryImport;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-
-public class LibraryImport extends AbstractModelElement implements ILibraryImport
-{
-
-    private static final long serialVersionUID = 1L;
-
-    public LibraryImport()
-    {
-        super("Library Import");
-    }
-
-    private String libraryName;
-    private VersionRange range = VersionRange.ANY_VERSION;
-
-    public String getLibraryName()
-    {
-        return libraryName;
-    }
-
-    public VersionRange getVersions()
-    {
-        return range;
-    }
-
-    public void setLibraryName(String name)
-    {
-        this.libraryName = name;
-    }
-
-    public void setVersions(VersionRange range)
-    {
-        this.range = range;
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/SigilBundle.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/SigilBundle.java
deleted file mode 100644
index 6390495..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/eclipse/SigilBundle.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.internal.model.eclipse;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.URI;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.jar.JarFile;
-
-import org.apache.felix.sigil.common.config.Resource;
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.model.AbstractCompoundModelElement;
-import org.apache.felix.sigil.common.model.eclipse.IBundleCapability;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.progress.IProgress;
-import org.apache.felix.sigil.common.util.ManifestUtil;
-import org.osgi.framework.Version;
-
-/**
- * @author dave
- *
- */
-public class SigilBundle extends AbstractCompoundModelElement implements ISigilBundle
-{
-
-    private static final long serialVersionUID = 1L;
-
-    private IBundleModelElement bundle;
-    private Resource[] sourcePaths;
-    private String[] classpath;
-    private String[] packages;
-    private File location;
-
-    private File sourcePathLocation;
-    private File licencePathLocation;
-    private String sourceRootPath;
-
-    public SigilBundle()
-    {
-        super("Sigil Bundle");
-        sourcePaths = new Resource[0];
-        classpath = new String[0];
-        packages = new String[0];
-    }
-    
-    public void synchronize(IProgress progress) throws IOException
-    {
-        progress = progress.newTask(100);
-        progress.report("Synchronizing " + bundle.getSymbolicName() + " binary");
-        sync(location, bundle.getUpdateLocation(), progress.newChild(45));
-
-        if (bundle.getSourceLocation() != null)
-        {
-            try
-            {
-                progress.report("Synchronizing " + bundle.getSymbolicName() + " source");
-                sync(sourcePathLocation, bundle.getSourceLocation(),
-                    progress.newChild(45));
-            }
-            catch (IOException e)
-            {
-                BldCore.error("Failed to download source for " + bundle.getSymbolicName()
-                    + " " + bundle.getVersion(), e.getCause());
-            }
-        }
-
-        if (bundle.getLicenseURI() != null)
-        {
-            try
-            {
-                progress.report("Synchronizing " + bundle.getSymbolicName() + " licence");
-                sync(licencePathLocation, bundle.getLicenseURI(), progress.newChild(10));
-            }
-            catch (IOException e)
-            {
-                BldCore.error("Failed to download licence for "
-                    + bundle.getSymbolicName() + " " + bundle.getVersion(), e.getCause());
-            }
-        }
-
-        updateManifest(location);
-    }
-
-    private void updateManifest(File location) throws IOException
-    {
-        if (location != null && location.exists())
-        {
-            JarFile f = new JarFile(location, false);
-            try
-            {
-                setBundleInfo(ManifestUtil.buildBundleModelElement(f));
-            }
-            finally
-            {
-                f.close();
-            }
-        }
-    }
-
-    public boolean isSynchronized()
-    {
-        return location == null || location.exists();
-    }
-
-    private static void sync(File local, URI remote, IProgress progress)
-        throws IOException
-    {
-        try
-        {
-            if (remote != null)
-            {
-                if (local != null && !local.exists())
-                {
-                    URL url = remote.toURL();
-                    URLConnection connection = url.openConnection();
-                    int contentLength = connection.getContentLength();
-
-                    progress = progress.newTask(contentLength);
-                    progress.report("Downloading from " + url.getHost());
-
-                    InputStream in = null;
-                    OutputStream out = null;
-                    try
-                    {
-                        URLConnection conn = url.openConnection();
-                        if (conn instanceof HttpURLConnection)
-                        {
-                            HttpURLConnection http = (HttpURLConnection) conn;
-                            http.setConnectTimeout(10000);
-                            http.setReadTimeout(5000);
-                        }
-                        in = conn.getInputStream();
-                        local.getParentFile().mkdirs();
-                        out = new FileOutputStream(local);
-                        stream(in, out, progress);
-                    }
-                    finally
-                    {
-                        if (in != null)
-                        {
-                            in.close();
-                        }
-                        if (out != null)
-                        {
-                            out.close();
-                        }
-                        progress.done();
-                    }
-                }
-            }
-        }
-        catch (IOException e)
-        {
-            local.delete();
-            throw e;
-        }
-    }
-
-    private static void stream(InputStream in, OutputStream out, IProgress progress)
-        throws IOException
-    {
-        byte[] b = new byte[1024];
-        for (;;)
-        {
-            if (progress.isCanceled())
-            {
-                throw new InterruptedIOException("User canceled download");
-            }
-            int r = in.read(b);
-            if (r == -1)
-                break;
-            out.write(b, 0, r);
-            progress.worked(r);
-        }
-
-        out.flush();
-    }
-
-    public IBundleModelElement getBundleInfo()
-    {
-        return bundle;
-    }
-
-    public void setBundleInfo(IBundleModelElement bundle)
-    {
-        if (bundle == null)
-        {
-            if (this.bundle != null)
-            {
-                this.bundle.setParent(null);
-            }
-        }
-        else
-        {
-            bundle.setParent(this);
-        }
-        this.bundle = bundle;
-    }
-
-    public void addSourcePath(Resource path)
-    {
-        ArrayList<Resource> tmp = new ArrayList<Resource>(getSourcePaths());
-        tmp.add(path);
-        sourcePaths = tmp.toArray(new Resource[tmp.size()]);
-    }
-
-    public void removeSourcePath(Resource path)
-    {
-        ArrayList<Resource> tmp = new ArrayList<Resource>(getSourcePaths());
-        if (tmp.remove(path))
-        {
-            sourcePaths = tmp.toArray(new Resource[tmp.size()]);
-        }
-    }
-
-    public Collection<Resource> getSourcePaths()
-    {
-        return Arrays.asList(sourcePaths);
-    }
-
-    public void clearSourcePaths()
-    {
-        sourcePaths = new Resource[0];
-    }
-
-    public void addClasspathEntry(String encodedClasspath)
-    {
-        encodedClasspath = encodedClasspath.trim();
-        ArrayList<String> tmp = new ArrayList<String>(getClasspathEntrys());
-        if (!tmp.contains(encodedClasspath)) {
-            tmp.add(encodedClasspath);
-            classpath = tmp.toArray(new String[tmp.size()]);
-        }
-    }
-
-    public Collection<String> getClasspathEntrys()
-    {
-        return Arrays.asList(classpath);
-    }
-
-    public void removeClasspathEntry(String encodedClasspath)
-    {
-        ArrayList<String> tmp = new ArrayList<String>(getClasspathEntrys());
-        if (tmp.remove(encodedClasspath.trim()))
-        {
-            classpath = tmp.toArray(new String[tmp.size()]);
-        }
-    }
-
-    public File getLocation()
-    {
-        return location;
-    }
-
-    public void setLocation(File location)
-    {
-        this.location = location;
-    }
-
-    public File getSourcePathLocation()
-    {
-        return sourcePathLocation;
-    }
-
-    public void setSourcePathLocation(File location)
-    {
-        this.sourcePathLocation = location;
-    }
-
-    public String getSourceRootPath()
-    {
-        return sourceRootPath;
-    }
-
-    public void setSourceRootPath(String location)
-    {
-        this.sourceRootPath = location;
-    }
-
-    public File getLicencePathLocation()
-    {
-        return licencePathLocation;
-    }
-
-    public void setLicencePathLocation(File licencePathLocation)
-    {
-        this.licencePathLocation = licencePathLocation;
-    }
-
-    public String getElementName()
-    {
-        return bundle.getSymbolicName();
-    }
-
-    public Version getVersion()
-    {
-        return bundle.getVersion();
-    }
-
-    public void setVersion(Version version)
-    {
-        this.bundle.setVersion(version);
-    }
-
-    public String getSymbolicName()
-    {
-        return bundle.getSymbolicName();
-    }
-
-    public Collection<String> getPackages()
-    {
-        return Arrays.asList(packages);
-    }
-
-    public void addPackage(String pkg)
-    {
-        ArrayList<String> tmp = new ArrayList<String>(getPackages());
-        tmp.add(pkg);
-        packages = tmp.toArray(new String[tmp.size()]);
-    }
-
-    public boolean removePackage(String pkg)
-    {
-        ArrayList<String> tmp = new ArrayList<String>(getPackages());
-        if (tmp.remove(pkg))
-        {
-            packages = tmp.toArray(new String[tmp.size()]);
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    public IPackageExport findExport(String packageName)
-    {
-        for (IPackageExport e : bundle.getExports())
-        {
-            if (packageName.equals(e.getPackageName()))
-            {
-                return e;
-            }
-        }
-        return null;
-    }
-
-    public IPackageImport findImport(String packageName)
-    {
-        for (IPackageImport i : bundle.getImports())
-        {
-            if (packageName.equals(i.getPackageName()))
-            {
-                return i;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public String toString()
-    {
-        return "SigilBundle["
-            + (getBundleInfo() == null ? null
-                : (getBundleInfo().getSymbolicName() + ":" + getBundleInfo().getVersion()))
-            + "]";
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (obj == null)
-            return false;
-        if (obj == this)
-            return true;
-
-        if (obj instanceof SigilBundle)
-        {
-            return obj.toString().equals(toString());
-        }
-
-        return false;
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return 31 * toString().hashCode();
-    }
-
-    @Override
-    public SigilBundle clone()
-    {
-        SigilBundle b = (SigilBundle) super.clone();
-        b.bundle = (IBundleModelElement) b.bundle.clone();
-
-        Resource[] newPaths = new Resource[b.sourcePaths.length];
-        System.arraycopy(b.sourcePaths, 0, newPaths, 0, b.sourcePaths.length);
-        b.sourcePaths = newPaths;
-
-        String[] tmp = new String[classpath.length];
-        System.arraycopy(b.classpath, 0, tmp, 0, b.classpath.length);
-        b.classpath = tmp;
-
-        tmp = new String[packages.length];
-        System.arraycopy(b.packages, 0, tmp, 0, b.packages.length);
-        b.packages = tmp;
-
-        return b;
-    }
-
-    public IBundleCapability getBundleCapability()
-    {
-        return new BundleCapability(bundle);
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/BundleModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/BundleModelElement.java
deleted file mode 100644
index de31c2d..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/BundleModelElement.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.internal.model.osgi;
-
-import java.net.URI;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.AbstractCompoundModelElement;
-import org.apache.felix.sigil.common.model.InvalidModelException;
-import org.apache.felix.sigil.common.model.eclipse.ILibraryImport;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.osgi.framework.Version;
-
-public class BundleModelElement extends AbstractCompoundModelElement implements IBundleModelElement
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1L;
-    // required obr values
-    private URI updateLocation;
-    private String symbolicName;
-    private Version version = Version.emptyVersion;
-    private IPackageImport[] imports;
-    private IPackageExport[] exports;
-    private IRequiredBundle[] requires;
-    private URI sourceLocation;
-    private String[] classpathElements;
-    private IRequiredBundle fragmentHost;
-
-    // human readable values
-    private String name;
-    private String description;
-    private String category;
-    private URI licenseURI;
-    private URI docURI;
-    private String vendor;
-    private String contactAddress;
-    private String copyright;
-
-    // internal values
-    private String activator;
-    private Set<ILibraryImport> libraries;
-
-    public BundleModelElement()
-    {
-        super("OSGi Bundle");
-        this.imports = new IPackageImport[0];
-        this.exports = new IPackageExport[0];
-        this.requires = new IRequiredBundle[0];
-        this.classpathElements = new String[0];
-        this.libraries = new HashSet<ILibraryImport>();
-    }
-
-    public String getActivator()
-    {
-        return activator;
-    }
-
-    public void setActivator(String activator)
-    {
-        this.activator = activator;
-    }
-
-    public void addLibraryImport(ILibraryImport library)
-    {
-        libraries.add(library);
-    }
-
-    public Set<ILibraryImport> getLibraryImports()
-    {
-        return libraries;
-    }
-
-    public void removeLibraryImport(ILibraryImport library)
-    {
-        libraries.remove(library);
-    }
-
-    public String getCategory()
-    {
-        return category;
-    }
-
-    public void setCategory(String category)
-    {
-        this.category = category;
-    }
-
-    public String getContactAddress()
-    {
-        return contactAddress;
-    }
-
-    public void setContactAddress(String contactAddress)
-    {
-        this.contactAddress = contactAddress;
-    }
-
-    public String getCopyright()
-    {
-        return copyright;
-    }
-
-    public void setCopyright(String copyright)
-    {
-        this.copyright = copyright;
-    }
-
-    public URI getDocURI()
-    {
-        return docURI;
-    }
-
-    public void setDocURI(URI docURI)
-    {
-        this.docURI = docURI;
-    }
-
-    public Collection<IPackageExport> getExports()
-    {
-        return Arrays.asList(exports);
-    }
-
-    public void addExport(IPackageExport packageExport)
-    {
-        HashSet<IPackageExport> tmp = new HashSet<IPackageExport>(getExports());
-        if (tmp.add(packageExport))
-        {
-            exports = tmp.toArray(new IPackageExport[tmp.size()]);
-            packageExport.setParent(this);
-        }
-    }
-
-    public void removeExport(IPackageExport packageExport)
-    {
-        HashSet<IPackageExport> tmp = new HashSet<IPackageExport>(getExports());
-        if (tmp.remove(packageExport))
-        {
-            exports = tmp.toArray(new IPackageExport[tmp.size()]);
-            packageExport.setParent(null);
-        }
-    }
-
-    public Collection<IPackageImport> getImports()
-    {
-        return Arrays.asList(imports);
-    }
-
-    public void addImport(IPackageImport packageImport)
-    {
-        HashSet<IPackageImport> tmp = new HashSet<IPackageImport>(getImports());
-        if (tmp.add(packageImport))
-        {
-            imports = tmp.toArray(new IPackageImport[tmp.size()]);
-            packageImport.setParent(this);
-        }
-    }
-
-    public void removeImport(IPackageImport packageImport)
-    {
-        HashSet<IPackageImport> tmp = new HashSet<IPackageImport>(getImports());
-        if (tmp.remove(packageImport))
-        {
-            imports = tmp.toArray(new IPackageImport[tmp.size()]);
-            packageImport.setParent(null);
-        }
-    }
-
-    public Collection<IRequiredBundle> getRequiredBundles()
-    {
-        return Arrays.asList(requires);
-    }
-
-    public void addRequiredBundle(IRequiredBundle bundle)
-    {
-        HashSet<IRequiredBundle> tmp = new HashSet<IRequiredBundle>(getRequiredBundles());
-        if (tmp.add(bundle))
-        {
-            requires = tmp.toArray(new IRequiredBundle[tmp.size()]);
-            bundle.setParent(this);
-        }
-    }
-
-    public void removeRequiredBundle(IRequiredBundle bundle)
-    {
-        HashSet<IRequiredBundle> tmp = new HashSet<IRequiredBundle>(getRequiredBundles());
-        if (tmp.remove(bundle))
-        {
-            requires = tmp.toArray(new IRequiredBundle[tmp.size()]);
-            bundle.setParent(null);
-        }
-    }
-
-    public URI getLicenseURI()
-    {
-        return licenseURI;
-    }
-
-    public void setLicenseURI(URI licenseURI)
-    {
-        this.licenseURI = licenseURI;
-    }
-
-    public URI getSourceLocation()
-    {
-        return sourceLocation;
-    }
-
-    public void setSourceLocation(URI sourceLocation)
-    {
-        this.sourceLocation = sourceLocation;
-    }
-
-    public String getSymbolicName()
-    {
-        return symbolicName;
-    }
-
-    public void setSymbolicName(String symbolicName)
-    {
-        this.symbolicName = symbolicName == null ? null : symbolicName.intern();
-    }
-
-    public URI getUpdateLocation()
-    {
-        return updateLocation;
-    }
-
-    public void setUpdateLocation(URI updateLocation)
-    {
-        this.updateLocation = updateLocation;
-    }
-
-    public String getVendor()
-    {
-        return vendor;
-    }
-
-    public void setVendor(String vendor)
-    {
-        this.vendor = vendor;
-    }
-
-    public Version getVersion()
-    {
-        return version;
-    }
-
-    public void setVersion(Version version)
-    {
-        this.version = version == null ? Version.emptyVersion : version;
-    }
-
-    public void checkValid() throws InvalidModelException
-    {
-        if (symbolicName == null)
-            throw new InvalidModelException(this, "Bundle symbolic name not set");
-    }
-
-    public BundleModelElement clone()
-    {
-        BundleModelElement bd = (BundleModelElement) super.clone();
-
-        bd.imports = new IPackageImport[imports.length];
-        bd.exports = new IPackageExport[exports.length];
-        bd.requires = new IRequiredBundle[requires.length];
-
-        for (int i = 0; i < imports.length; i++)
-        {
-            bd.imports[i] = (IPackageImport) imports[i].clone();
-        }
-
-        for (int i = 0; i < exports.length; i++)
-        {
-            bd.exports[i] = (IPackageExport) exports[i].clone();
-        }
-
-        for (int i = 0; i < requires.length; i++)
-        {
-            bd.requires[i] = (IRequiredBundle) requires[i].clone();
-        }
-
-        return bd;
-    }
-
-    public String toString()
-    {
-        StringBuffer buf = new StringBuffer();
-
-        buf.append("BundleModelElement[");
-        buf.append(symbolicName);
-        buf.append(", ");
-        buf.append(version);
-        buf.append("]");
-
-        return buf.toString();
-    }
-
-    public String getName()
-    {
-        return name;
-    }
-
-    public void setName(String name)
-    {
-        this.name = name;
-    }
-
-    public String getDescription()
-    {
-        return description;
-    }
-
-    public void setDescription(String description)
-    {
-        this.description = description;
-    }
-
-    public void addClasspath(String path)
-    {
-        HashSet<String> tmp = new HashSet<String>(Arrays.asList(classpathElements));
-        if (tmp.add(path))
-        {
-            classpathElements = tmp.toArray(new String[tmp.size()]);
-        }
-    }
-
-    public Collection<String> getClasspaths()
-    {
-        return classpathElements.length == 0 ? Collections.singleton(".")
-            : Arrays.asList(classpathElements);
-    }
-
-    public void removeClasspath(String path)
-    {
-        HashSet<String> tmp = new HashSet<String>(Arrays.asList(classpathElements));
-        if (tmp.remove(path))
-        {
-            classpathElements = tmp.toArray(new String[tmp.size()]);
-        }
-    }
-
-    public IRequiredBundle getFragmentHost()
-    {
-        return fragmentHost;
-    }
-
-    public void setFragmentHost(IRequiredBundle fragmentHost)
-    {
-        this.fragmentHost = fragmentHost;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/PackageExport.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/PackageExport.java
deleted file mode 100644
index 88efb5e..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/PackageExport.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.internal.model.osgi;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-
-import org.apache.felix.sigil.common.model.AbstractModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.osgi.framework.Version;
-
-public class PackageExport extends AbstractModelElement implements IPackageExport
-{
-
-    private static final long serialVersionUID = 1L;
-
-    private String name;
-    private Version version;
-    private String[] uses = new String[0];
-
-    public PackageExport()
-    {
-        super("OSGi Package Export");
-    }
-
-    public String getPackageName()
-    {
-        return name;
-    }
-
-    public void setPackageName(String packageName)
-    {
-        this.name = packageName;
-    }
-
-    public Version getVersion()
-    {
-        Version result;
-        if (version != null)
-        {
-            result = version;
-        }
-        else
-        {
-            ISigilBundle owningBundle = getAncestor(ISigilBundle.class);
-            if (owningBundle == null)
-            {
-                result = Version.emptyVersion;
-            }
-            else
-            {
-                result = owningBundle.getVersion();
-            }
-        }
-        return result;
-    }
-
-    public Version getRawVersion()
-    {
-        return version;
-    }
-
-    public void setVersion(Version version)
-    {
-        this.version = version; // == null ? Version.emptyVersion : version;
-    }
-
-    public void addUse(String use)
-    {
-        ArrayList<String> tmp = new ArrayList<String>(getUses());
-        tmp.add(use);
-        uses = tmp.toArray(new String[tmp.size()]);
-    }
-
-    public Collection<String> getUses()
-    {
-        return Arrays.asList(uses);
-    }
-
-    public void removeUse(String use)
-    {
-        ArrayList<String> tmp = new ArrayList<String>(getUses());
-        tmp.remove(use);
-        uses = tmp.toArray(new String[tmp.size()]);
-    }
-
-    @Override
-    public String toString()
-    {
-        return "PackageExport[" + name + ":" + version + ":uses=" + uses + "]";
-    }
-
-    public void setUses(Collection<String> uses)
-    {
-        ArrayList<String> tmp = new ArrayList<String>(uses);
-        this.uses = tmp.toArray(new String[tmp.size()]);
-    }
-
-    public int compareTo(IPackageExport o)
-    {
-        int i = name.compareTo(o.getPackageName());
-
-        if (i == 0)
-        {
-            i = compareVersion(o.getVersion());
-        }
-
-        return i;
-    }
-
-    private int compareVersion(Version other)
-    {
-        if (version == null)
-        {
-            if (other == null)
-            {
-                return 0;
-            }
-            else
-            {
-                return 1;
-            }
-        }
-        else
-        {
-            if (other == null)
-            {
-                return -1;
-            }
-            else
-            {
-                return version.compareTo(other);
-            }
-        }
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (obj == this)
-            return true;
-        if (obj == null)
-            return false;
-
-        if (obj instanceof PackageExport)
-        {
-            PackageExport e = (PackageExport) obj;
-            return (name == null ? e.name == null : name.equals(e.name))
-                && (version == null ? e.version == null : version.equals(e.version));
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode()
-    {
-        int hc = name.hashCode();
-
-        if (version != null)
-            hc *= version.hashCode();
-
-        return hc;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/PackageImport.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/PackageImport.java
deleted file mode 100644
index 4d5ea93..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/PackageImport.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.internal.model.osgi;
-
-import org.apache.felix.sigil.common.model.AbstractModelElement;
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.apache.felix.sigil.common.model.InvalidModelException;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-
-public class PackageImport extends AbstractModelElement implements IPackageImport
-{
-
-    private static final long serialVersionUID = 1L;
-
-    private String name;
-    private VersionRange versions = VersionRange.ANY_VERSION;
-
-    // resolution directive
-    private boolean optional;
-    private boolean dependency = true;
-    private OSGiImport osgiImport = OSGiImport.AUTO;
-
-    public PackageImport()
-    {
-        super("OSGi Package Import");
-    }
-
-    @Override
-    public void checkValid() throws InvalidModelException
-    {
-        if (name == null)
-        {
-            throw new InvalidModelException(this, "Package name must be set");
-        }
-    }
-
-    public boolean isOptional()
-    {
-        return optional;
-    }
-
-    public void setOptional(boolean optional)
-    {
-        this.optional = optional;
-    }
-
-    public boolean isDependency()
-    {
-        return dependency;
-    }
-
-    public void setDependency(boolean dependency)
-    {
-        this.dependency = dependency;
-    }
-
-    public OSGiImport getOSGiImport()
-    {
-        return osgiImport;
-    }
-
-    public void setOSGiImport(OSGiImport osgiHeader)
-    {
-        this.osgiImport = osgiHeader;
-    }
-
-    public String getPackageName()
-    {
-        return name;
-    }
-
-    public void setPackageName(String name)
-    {
-        this.name = name;
-    }
-
-    public VersionRange getVersions()
-    {
-        return versions;
-    }
-
-    public void setVersions(VersionRange versions)
-    {
-        this.versions = versions == null ? VersionRange.ANY_VERSION : versions;
-    }
-
-    @Override
-    public String toString()
-    {
-        return "Package-Import[" + name + ":" + versions + ":"
-            + (optional ? "optional" : "mandatory") + "]";
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-
-        if (obj instanceof PackageImport)
-        {
-            PackageImport pi = (PackageImport) obj;
-            return name.equals(pi.name) && versions.equals(pi.versions)
-                && optional == pi.optional;
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode()
-    {
-        int hc = name.hashCode() * versions.hashCode();
-
-        if (optional)
-        {
-            hc *= -1;
-        }
-
-        return hc;
-    }
-
-    public boolean accepts(ICapabilityModelElement provider)
-    {
-        if (provider instanceof IPackageExport)
-        {
-            IPackageExport pe = (IPackageExport) provider;
-            return pe.getPackageName().equals(name) && versions.contains(pe.getVersion());
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    public int compareTo(IPackageImport o)
-    {
-        int i = name.compareTo(o.getPackageName());
-
-        if (i == 0)
-        {
-            i = compareVersion(o.getVersions());
-        }
-
-        return i;
-    }
-
-    private int compareVersion(VersionRange range)
-    {
-        if (versions == null)
-        {
-            if (range == null)
-            {
-                return 0;
-            }
-            else
-            {
-                return 1;
-            }
-        }
-        else
-        {
-            if (range == null)
-            {
-                return -1;
-            }
-            else
-            {
-                return versions.getCeiling().compareTo(range.getCeiling());
-            }
-        }
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/RequiredBundle.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/RequiredBundle.java
deleted file mode 100644
index 187e040..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/internal/model/osgi/RequiredBundle.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.internal.model.osgi;
-
-import org.apache.felix.sigil.common.model.AbstractModelElement;
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.apache.felix.sigil.common.model.eclipse.IBundleCapability;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-
-public class RequiredBundle extends AbstractModelElement implements IRequiredBundle
-{
-    private static final long serialVersionUID = 1L;
-
-    private String symbolicName;
-    private VersionRange versions = VersionRange.ANY_VERSION;
-    private boolean optional;
-
-    public RequiredBundle()
-    {
-        super("OSGi Bundle Requirement");
-    }
-
-    public String getSymbolicName()
-    {
-        return symbolicName;
-    }
-
-    public void setSymbolicName(String symbolicName)
-    {
-        this.symbolicName = symbolicName == null ? null : symbolicName.intern();
-    }
-
-    public VersionRange getVersions()
-    {
-        return versions;
-    }
-
-    public void setVersions(VersionRange versions)
-    {
-        this.versions = versions == null ? VersionRange.ANY_VERSION : versions;
-    }
-
-    public boolean isOptional()
-    {
-        return optional;
-    }
-
-    public void setOptional(boolean optional)
-    {
-        this.optional = optional;
-    }
-
-    @Override
-    public String toString()
-    {
-        return "RequiredBundle[" + symbolicName + ":" + versions + ":"
-            + (optional ? "optional" : "mandatory") + "]";
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-
-        if (obj instanceof RequiredBundle)
-        {
-            RequiredBundle rb = (RequiredBundle) obj;
-            return symbolicName.equals(rb.symbolicName) && versions.equals(rb.versions)
-                && optional == rb.optional;
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode()
-    {
-        int hc = symbolicName.hashCode() * versions.hashCode();
-
-        if (optional)
-        {
-            hc *= -1;
-        }
-
-        return hc;
-    }
-
-    public boolean accepts(ICapabilityModelElement provider)
-    {
-        if (provider instanceof IBundleCapability)
-        {
-            IBundleCapability bndl = (IBundleCapability) provider;
-            return symbolicName.equals(bndl.getSymbolicName())
-                && versions.contains(bndl.getVersion());
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    public int compareTo(IRequiredBundle o)
-    {
-        int i = symbolicName.compareTo(o.getSymbolicName());
-
-        if (i == 0)
-        {
-            i = compareVersion(o.getVersions());
-        }
-
-        return i;
-    }
-
-    private int compareVersion(VersionRange range)
-    {
-        if (versions == null)
-        {
-            if (range == null)
-            {
-                return 0;
-            }
-            else
-            {
-                return 1;
-            }
-        }
-        else
-        {
-            if (range == null)
-            {
-                return -1;
-            }
-            else
-            {
-                return versions.getCeiling().compareTo(range.getCeiling());
-            }
-        }
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/licence/ILicenseManager.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/licence/ILicenseManager.java
deleted file mode 100644
index ecc57a9..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/licence/ILicenseManager.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.licence;
-
-import java.util.Set;
-import java.util.regex.Pattern;
-
-public interface ILicenseManager
-{
-    void addLicense(String name, Pattern pattern);
-
-    void removeLicense(String name);
-
-    Set<String> getLicenseNames();
-
-    Pattern getLicensePattern(String name);
-
-    ILicensePolicy getDefaultPolicy();
-    //ILicensePolicy getPolicy(ISigilProjectModel project);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/licence/ILicensePolicy.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/licence/ILicensePolicy.java
deleted file mode 100644
index 450e6f0..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/licence/ILicensePolicy.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.licence;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.progress.IProgress;
-
-public interface ILicensePolicy
-{
-    void addAllowed(String licenseName);
-
-    void removeAllowed(String licenseName);
-
-    boolean accept(ISigilBundle bundle);
-
-    void save(IProgress progress);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/BundleResolver.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/BundleResolver.java
deleted file mode 100644
index 77b740d..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/BundleResolver.java
+++ /dev/null
@@ -1,564 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.repository;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.apache.felix.sigil.common.model.ICompoundModelElement;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.common.model.IRequirementModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ILibrary;
-import org.apache.felix.sigil.common.model.eclipse.ILibraryImport;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.progress.IProgress;
-import org.apache.felix.sigil.common.repository.AbstractRepositoryManager;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IBundleResolver;
-import org.apache.felix.sigil.common.repository.IResolution;
-import org.apache.felix.sigil.common.repository.IResolutionMonitor;
-import org.apache.felix.sigil.common.repository.ResolutionConfig;
-import org.apache.felix.sigil.common.repository.ResolutionException;
-import org.osgi.framework.Version;
-
-public class BundleResolver implements IBundleResolver
-{
-
-    private static class BundleOrderComparator implements Comparator<ISigilBundle>
-    {
-        private IModelElement requirement;
-
-        public BundleOrderComparator(IModelElement requirement)
-        {
-            this.requirement = requirement;
-        }
-
-        public int compare(ISigilBundle o1, ISigilBundle o2)
-        {
-            int c = compareVersions(o1, o2);
-
-            if (c == 0)
-            {
-                c = compareImports(o1, o2);
-            }
-
-            return c;
-        }
-
-        private int compareImports(ISigilBundle o1, ISigilBundle o2)
-        {
-            int c1 = o1.getBundleInfo().getImports().size();
-            int c2 = o2.getBundleInfo().getImports().size();
-
-            if (c1 < c2)
-            {
-                return -1;
-            }
-            else if (c2 > c1)
-            {
-                return 1;
-            }
-            else
-            {
-                return 0;
-            }
-        }
-
-        private int compareVersions(ISigilBundle o1, ISigilBundle o2)
-        {
-            Version v1 = null;
-            Version v2 = null;
-            if (requirement instanceof IPackageImport)
-            {
-                v1 = findExportVersion((IPackageImport) requirement, o1);
-                v2 = findExportVersion((IPackageImport) requirement, o2);
-            }
-            else if (requirement instanceof IRequiredBundle)
-            {
-                v1 = o1.getBundleInfo().getVersion();
-                v2 = o1.getBundleInfo().getVersion();
-            }
-
-            if (v1 == null)
-            {
-                if (v2 == null)
-                {
-                    return 0;
-                }
-                else
-                {
-                    return 1;
-                }
-            }
-            else
-            {
-                if (v2 == null)
-                {
-                    return -1;
-                }
-                else
-                {
-                    return v2.compareTo(v1);
-                }
-            }
-        }
-
-        private Version findExportVersion(IPackageImport pi, ISigilBundle o1)
-        {
-            for (IPackageExport pe : o1.getBundleInfo().getExports())
-            {
-                if (pi.getPackageName().equals(pi.getPackageName()))
-                {
-                    return pe.getVersion();
-                }
-            }
-
-            return null;
-        }
-
-    }
-
-    private static class ResolutionContext
-    {
-        private final IModelElement root;
-        private final ResolutionConfig config;
-        private final IResolutionMonitor monitor;
-
-        private final Resolution resolution = new Resolution();
-        private final LinkedList<IModelElement> requirements = new LinkedList<IModelElement>();
-
-        public ResolutionContext(IModelElement root, ResolutionConfig config, IResolutionMonitor monitor)
-        {
-            this.root = root;
-            this.config = config;
-            this.monitor = monitor;
-        }
-
-        public boolean isValid()
-        {
-            return resolution.isSuccess();
-        }
-
-        public void setValid(boolean valid)
-        {
-            resolution.setSuccess(valid);
-        }
-
-        public ResolutionException newResolutionException()
-        {
-            return new ResolutionException(root,
-                requirements.toArray(new IModelElement[requirements.size()]));
-        }
-
-        public void startRequirement(IRequirementModelElement element)
-        {
-            requirements.add(element);
-            monitor.startResolution(element);
-        }
-
-        public void endRequirement(IRequirementModelElement element)
-        {
-            ISigilBundle provider = resolution.getProvider(element);
-
-            setValid(provider != null || element.isOptional() || config.isIgnoreErrors());
-
-            if (isValid())
-            {
-                // only clear stack if valid
-                // else use it as an aid to trace errors
-                requirements.remove(element);
-            }
-
-            monitor.endResolution(element, provider);
-        }
-    }
-
-    private static class Resolution implements IResolution
-    {
-        private Map<ISigilBundle, List<IModelElement>> providees = new HashMap<ISigilBundle, List<IModelElement>>();
-        private Map<IModelElement, ISigilBundle> providers = new HashMap<IModelElement, ISigilBundle>();
-        private boolean success = true; // assume success
-
-        boolean addProvider(IModelElement element, ISigilBundle provider)
-        {
-            providers.put(element, provider);
-
-            List<IModelElement> requirements = providees.get(provider);
-
-            boolean isNewProvider = requirements == null;
-
-            if (isNewProvider)
-            {
-                requirements = new ArrayList<IModelElement>();
-                providees.put(provider, requirements);
-            }
-
-            requirements.add(element);
-
-            return isNewProvider;
-        }
-
-        void removeProvider(IModelElement element, ISigilBundle provider)
-        {
-            providers.remove(element);
-            List<IModelElement> e = providees.get(provider);
-            e.remove(element);
-            if (e.isEmpty())
-            {
-                providees.remove(provider);
-            }
-        }
-
-        void setSuccess(boolean success)
-        {
-            this.success = success;
-        }
-
-        public boolean isSuccess()
-        {
-            return success;
-        }
-
-        public ISigilBundle getProvider(IModelElement requirement)
-        {
-            return providers.get(requirement);
-        }
-
-        public Set<ISigilBundle> getBundles()
-        {
-            return providees.keySet();
-        }
-
-        public List<IModelElement> getMatchedRequirements(ISigilBundle bundle)
-        {
-            return providees.get(bundle);
-        }
-
-        public boolean isSynchronized()
-        {
-            for (ISigilBundle b : getBundles())
-            {
-                if (!b.isSynchronized())
-                {
-                    return false;
-                }
-            }
-
-            return true;
-        }
-
-        public void synchronize(IProgress progress)
-        {
-            Set<ISigilBundle> bundles = getBundles();
-            progress = progress.newTask(bundles.size()*100);
-
-            for (ISigilBundle b : bundles)
-            {
-                if (progress.isCanceled())
-                {
-                    break;
-                }
-
-                try
-                {
-                    b.synchronize(progress.newChild(100));
-                }
-                catch (IOException e)
-                {
-                    BldCore.error("Failed to synchronize " + b, e);
-                }
-            }
-        }
-    }
-
-    private static final IResolutionMonitor NULL_MONITOR = new IResolutionMonitor()
-    {
-        public void endResolution(IModelElement requirement, ISigilBundle sigilBundle)
-        {
-        }
-
-        public boolean isCanceled()
-        {
-            return false;
-        }
-
-        public void startResolution(IModelElement requirement)
-        {
-        }
-    };
-
-    private static final Comparator<IRequirementModelElement> REQUIREMENT_COMPARATOR = new Comparator<IRequirementModelElement>()
-    {
-        public int compare(IRequirementModelElement o1, IRequirementModelElement o2)
-        {
-            if (o1 instanceof IPackageImport)
-            {
-                if (o2 instanceof IPackageImport)
-                {
-                    return 0;
-                }
-                else
-                {
-                    return -1;
-                }
-            }
-            else
-            // assumes only alternative is IRequiredBundle
-            {
-                if (o2 instanceof IRequiredBundle)
-                {
-                    return 0;
-                }
-                else
-                {
-                    return 1;
-                }
-            }
-        }
-    };
-
-    private final AbstractRepositoryManager repositoryManager;
-
-    public BundleResolver(AbstractRepositoryManager repositoryManager)
-    {
-        this.repositoryManager = repositoryManager;
-    }
-
-    public IResolution resolve(IModelElement element, ResolutionConfig config,
-        IResolutionMonitor monitor) throws ResolutionException
-    {
-        if (monitor == null)
-        {
-            monitor = NULL_MONITOR;
-        }
-        ResolutionContext ctx = new ResolutionContext(element, config, monitor);
-
-        resolveElement(element, ctx);
-
-        if (!ctx.isValid())
-        {
-            throw ctx.newResolutionException();
-        }
-
-        return ctx.resolution;
-    }
-
-    private void resolveElement(IModelElement element, ResolutionContext ctx)
-        throws ResolutionException
-    {
-        if (ctx.isValid())
-        {
-            for (IRequirementModelElement req : findRequirements(element, ctx))
-            {
-                if (ctx.monitor.isCanceled())
-                    break;
-                resolveRequirement(req, ctx);
-            }
-        }
-    }
-
-    private List<IRequirementModelElement> findRequirements(IModelElement element,
-        final ResolutionContext ctx)
-    {
-        final LinkedList<IRequirementModelElement> reqs = new LinkedList<IRequirementModelElement>();
-
-        if (element instanceof IRequirementModelElement)
-        {
-            reqs.add((IRequirementModelElement) element);
-        }
-        else if (element instanceof ICompoundModelElement)
-        {
-            ICompoundModelElement compound = (ICompoundModelElement) element;
-            compound.visit(new IModelWalker()
-            {
-                public boolean visit(IModelElement element)
-                {
-                    if (element instanceof IRequirementModelElement)
-                    {
-                        reqs.add((IRequirementModelElement) element);
-                    }
-                    else if (element instanceof ILibrary)
-                    {
-                        ILibrary lib = repositoryManager.resolveLibrary((ILibraryImport) element);
-                        reqs.addAll(lib.getImports());
-                    }
-
-                    return !ctx.monitor.isCanceled();
-                }
-            });
-        }
-
-        if (!ctx.monitor.isCanceled())
-        {
-            Collections.sort(reqs, REQUIREMENT_COMPARATOR);
-        }
-        return reqs;
-    }
-
-    private void resolveRequirement(IRequirementModelElement requirement,
-        ResolutionContext ctx) throws ResolutionException
-    {
-        if (ctx.config.isOptional() || !requirement.isOptional())
-        {
-            ctx.startRequirement(requirement);
-
-            try
-            {
-                if (!findInContext(requirement, ctx))
-                {
-                    findInRepositories(requirement, ctx);
-                }
-            }
-            finally
-            {
-                ctx.endRequirement(requirement);
-            }
-        }
-    }
-
-    private boolean findInContext(final IRequirementModelElement requirement,
-        final ResolutionContext ctx)
-    {
-        for (final ISigilBundle b : ctx.resolution.providees.keySet())
-        {
-            b.visit(new IModelWalker()
-            {
-                public boolean visit(IModelElement element)
-                {
-                    if (element instanceof ICapabilityModelElement)
-                    {
-                        if (requirement.accepts((ICapabilityModelElement) element))
-                        {
-                            ctx.resolution.addProvider(requirement, b);
-                            return false;
-                        }
-                    }
-                    return !ctx.monitor.isCanceled();
-                }
-
-            });
-        }
-
-        return ctx.resolution.getProvider(requirement) != null;
-    }
-
-    private void findInRepositories(IRequirementModelElement requirement,
-        ResolutionContext ctx) throws ResolutionException
-    {
-        int[] priorities = repositoryManager.getPriorityLevels();
-
-        outer: for (int i = 0; i < priorities.length; i++)
-        {
-            List<ISigilBundle> providers = findProvidersAtPriority(priorities[i],
-                requirement, ctx);
-
-            if (!providers.isEmpty() && !ctx.monitor.isCanceled())
-            {
-                if (providers.size() > 1)
-                {
-                    Collections.sort(providers, new BundleOrderComparator(requirement));
-                }
-
-                for (ISigilBundle provider : providers)
-                {
-                    // reset validity - if there's another provider it can still be solved
-                    ctx.setValid(true);
-                    if (ctx.resolution.addProvider(requirement, provider))
-                    {
-                        if (ctx.config.isDependents())
-                        {
-                            resolveElement(provider, ctx);
-                        }
-
-                        if (ctx.isValid())
-                        {
-                            break outer;
-                        }
-                        else
-                        {
-                            ctx.resolution.removeProvider(requirement, provider);
-                        }
-                    }
-                    else
-                    {
-                        break outer;
-                    }
-                }
-            }
-        }
-    }
-
-    private List<ISigilBundle> findProvidersAtPriority(int i,
-        IRequirementModelElement requirement, ResolutionContext ctx)
-        throws ResolutionException
-    {
-        ArrayList<ISigilBundle> providers = new ArrayList<ISigilBundle>();
-
-        for (IBundleRepository rep : repositoryManager.getRepositories(i))
-        {
-            if (ctx.monitor.isCanceled())
-            {
-                break;
-            }
-            providers.addAll(findProviders(requirement, ctx.config, rep));
-        }
-
-        return providers;
-    }
-
-    private Collection<ISigilBundle> findProviders(IRequirementModelElement requirement,
-        ResolutionConfig config, IBundleRepository rep) throws ResolutionException
-    {
-        ArrayList<ISigilBundle> found = new ArrayList<ISigilBundle>();
-
-        if (requirement instanceof IPackageImport)
-        {
-            IPackageImport pi = (IPackageImport) requirement;
-            found.addAll(rep.findAllProviders(pi, config.getOptions()));
-        }
-        else if (requirement instanceof IRequiredBundle)
-        {
-            IRequiredBundle rb = (IRequiredBundle) requirement;
-            found.addAll(rep.findAllProviders(rb, config.getOptions()));
-        }
-        else
-        {
-            // shouldn't get here - developer error if do
-            // use isRequirement before getting anywhere near this logic...
-            throw new IllegalStateException("Invalid requirement type " + requirement);
-        }
-
-        return found;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/DirectoryHelper.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/DirectoryHelper.java
deleted file mode 100644
index ec6179d..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/DirectoryHelper.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.repository;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.jar.JarFile;
-
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.ModelElementFactoryException;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.repository.AbstractBundleRepository;
-import org.apache.felix.sigil.common.util.ManifestUtil;
-
-public class DirectoryHelper
-{
-    public static void scanBundles(AbstractBundleRepository repository,
-        List<ISigilBundle> bundles, File dir, File source, boolean recursive)
-    {
-        if (dir.exists())
-        {
-            for (File f : dir.listFiles())
-            {
-                if (f.isDirectory())
-                {
-                    if (recursive)
-                    {
-                        scanBundles(repository, bundles, f, source, recursive);
-                    }
-                }
-                else if (f.isFile() && f.getName().endsWith(".jar"))
-                {
-                    JarFile jar = null;
-                    try
-                    {
-                        jar = new JarFile(f, false);
-                        ISigilBundle bundle = buildBundle(repository, jar,
-                            f);
-                        if (bundle != null)
-                        {
-                            bundle.setSourcePathLocation(source);
-                            // TODO shouldn't be hard coded
-                            bundle.setSourceRootPath("src");
-                            bundles.add(bundle);
-                        }
-                    }
-                    catch (IOException e)
-                    {
-                        BldCore.error("Failed to read jar file " + f, e);
-                    }
-                    catch (ModelElementFactoryException e)
-                    {
-                        BldCore.error("Failed to build bundle " + f, e);
-                    }
-                    catch (RuntimeException e)
-                    {
-                        BldCore.error("Failed to build bundle " + f, e);
-                    }
-                    finally
-                    {
-                        if (jar != null)
-                        {
-                            try
-                            {
-                                jar.close();
-                            }
-                            catch (IOException e)
-                            {
-                                BldCore.error("Failed to close jar file", e);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private static ISigilBundle buildBundle(AbstractBundleRepository repository,
-        JarFile jar, File f) throws IOException
-    {
-        IBundleModelElement info = ManifestUtil.buildBundleModelElement(jar);
-
-        ISigilBundle bundle = null;
-
-        if (info != null)
-        {
-            bundle = ModelElementFactory.getInstance().newModelElement(ISigilBundle.class);
-            bundle.addChild(info);
-            bundle.setLocation(f);
-        }
-
-        return bundle;
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/FileSystemRepository.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/FileSystemRepository.java
deleted file mode 100644
index b20c32c..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/FileSystemRepository.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.repository;
-
-import java.io.File;
-import java.util.ArrayList;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.repository.AbstractBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-
-public class FileSystemRepository extends AbstractBundleRepository
-{
-
-    private ArrayList<ISigilBundle> bundles;
-    private File dir;
-    private boolean recurse;
-
-    public FileSystemRepository(String id, File dir, boolean recurse)
-    {
-        super(id);
-        this.dir = dir;
-        this.recurse = recurse;
-    }
-
-    @Override
-    public void accept(IRepositoryVisitor visitor, int options)
-    {
-        synchronized (this)
-        {
-            if (bundles == null)
-            {
-                bundles = new ArrayList<ISigilBundle>();
-                DirectoryHelper.scanBundles(this, bundles, dir, null, recurse);
-            }
-        }
-
-        for (ISigilBundle b : bundles)
-        {
-            if (!visitor.visit(b))
-            {
-                break;
-            }
-        }
-    }
-
-    public void refresh()
-    {
-        synchronized (this)
-        {
-            bundles = null;
-        }
-
-        notifyChange();
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/FileSystemRepositoryProvider.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/FileSystemRepositoryProvider.java
deleted file mode 100644
index 0926558..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/FileSystemRepositoryProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.repository;
-
-import java.io.File;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-import org.apache.felix.sigil.common.repository.RepositoryException;
-
-public class FileSystemRepositoryProvider implements IRepositoryProvider
-{
-
-    public IBundleRepository createRepository(String id, Properties preferences)
-        throws RepositoryException
-    {
-        String dirStr = preferences.getProperty("dir");
-        File dir = new File(dirStr);
-        if (!dir.isDirectory())
-        {
-            throw new RepositoryException("directory '" + dir + "' does not exist.");
-        }
-        boolean recurse = Boolean.valueOf(preferences.getProperty("recurse"));
-        return new FileSystemRepository(id, dir, recurse);
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/SystemRepository.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/SystemRepository.java
deleted file mode 100644
index 4c0a6e3..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/SystemRepository.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.repository;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.jar.JarFile;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.ModelElementFactoryException;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.apache.felix.sigil.common.repository.AbstractBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-import org.apache.felix.sigil.common.util.ManifestUtil;
-import org.osgi.framework.Version;
-
-public class SystemRepository extends AbstractBundleRepository
-{
-
-    private final String packages;
-    private final File frameworkPath;
-
-    public SystemRepository(String id, File frameworkPath, String packages)
-    {
-        super(id);
-        this.frameworkPath = frameworkPath;
-        this.packages = packages;
-    }
-
-    private static ISigilBundle systemBundle;
-
-    @Override
-    public void accept(IRepositoryVisitor visitor, int options)
-    {
-        ISigilBundle bundle = loadSystemBundle();
-
-        if (bundle != null)
-        {
-            visitor.visit(bundle);
-        }
-    }
-
-    private synchronized ISigilBundle loadSystemBundle()
-    {
-        if (systemBundle == null)
-        {
-            systemBundle = ModelElementFactory.getInstance().newModelElement(
-                ISigilBundle.class);
-
-            JarFile jar = null;
-
-            try
-            {
-                final IBundleModelElement info;
-                if (frameworkPath != null)
-                {
-                    systemBundle.setLocation(frameworkPath);
-                    jar = new JarFile(frameworkPath,false);
-                    info = ManifestUtil.buildBundleModelElement(jar);
-                }
-                else
-                {
-                    info = ModelElementFactory.getInstance().newModelElement(
-                        IBundleModelElement.class);
-                }
-
-                info.setSymbolicName("system bundle");
-                info.setName("Sigil system bundle");
-
-                applyProfile(info);
-                systemBundle.addChild(info);
-            }
-            catch (IOException e)
-            {
-                BldCore.error("Failed to read jar file " + frameworkPath, e);
-            }
-            catch (ModelElementFactoryException e)
-            {
-                BldCore.error("Failed to build bundle " + frameworkPath, e);
-            }
-            catch (RuntimeException e)
-            {
-                BldCore.error("Failed to build bundle " + frameworkPath, e);
-            }
-            finally
-            {
-                if (jar != null)
-                {
-                    try
-                    {
-                        jar.close();
-                    }
-                    catch (IOException e)
-                    {
-                        BldCore.error("Failed to close jar file", e);
-                    }
-                }
-            }
-        }
-
-        return systemBundle;
-    }
-
-    private static final Pattern attrPattern = Pattern.compile("(.*?)=\"?(.*?)\"?$");
-    
-    private void applyProfile(IBundleModelElement info)
-    {
-        if (packages != null)
-        {
-            String version = null;
-            for (String name : packages.split(";\\s*"))
-            {
-                Matcher m = attrPattern.matcher(name);
-                if ( m.matches() ) {                    
-                    if ("version".equals(m.group(1))) {
-                        version = m.group(2);
-                    }
-                }
-                else {
-                    IPackageExport pe = ModelElementFactory.getInstance().newModelElement(
-                        IPackageExport.class);
-                    pe.setPackageName(name);
-                    info.addExport(pe);
-                }
-            }
-            
-            if ( version != null ) {
-                Version v = VersionTable.getVersion(version);
-                for(IPackageExport pe : info.getExports()) {
-                    pe.setVersion(v);
-                }
-            }
-        }
-    }
-
-    public synchronized void refresh()
-    {
-        systemBundle = null;
-        notifyChange();
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/SystemRepositoryProvider.java b/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/SystemRepositoryProvider.java
deleted file mode 100644
index 27ed3b3..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/core/repository/SystemRepositoryProvider.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.core.repository;
-
-import java.io.File;
-import java.io.IOException;
-
-import java.io.InputStream;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.config.BldUtil;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-import org.apache.felix.sigil.common.repository.RepositoryException;
-
-public class SystemRepositoryProvider implements IRepositoryProvider
-{
-
-    public IBundleRepository createRepository(String id, Properties properties)
-        throws RepositoryException
-    {
-        String fw = properties.getProperty("framework");
-        File frameworkPath = fw == null ? null : new File(fw);
-        String extraPkgs = properties.getProperty("packages");
-        String profile = properties.getProperty("profile");
-
-        try
-        {
-            String pkgs = readSystemPackages(profile);
-            
-            if ( extraPkgs != null ) {
-                pkgs += "," + extraPkgs;
-            }
-            
-            return new SystemRepository(id, frameworkPath, pkgs);
-        }
-        catch (IOException e)
-        {
-            throw new RepositoryException("Failed to load profile", e);
-        }
-    }
-    
-    public static String readSystemPackages(String name) throws IOException {
-        Properties p = readProperties();
-        
-        String key = systemPackagesKey(name);
-        
-        return BldUtil.expand(p.getProperty(key), p);
-    }
-
-    public static Properties readProperties() throws IOException
-    {
-
-        String profilePath = "profiles/jvm-packages.properties";
-        InputStream in = SystemRepositoryProvider.class.getClassLoader().getResourceAsStream(
-            profilePath);
-
-        if (in == null)
-            throw new IllegalStateException("Missing jvm packages: " + profilePath);
-
-        Properties p = new Properties();
-        
-        p.load(in);
-
-        return p;
-    }
-    
-    private static String systemPackagesKey(String name) {
-        if (name == null)
-        {
-            String version = System.getProperty("java.specification.version");
-            name = "jre-" + version;
-        }
-        
-        return name;
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/AbstractCompoundModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/AbstractCompoundModelElement.java
deleted file mode 100644
index 2bbf575..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/AbstractCompoundModelElement.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-public abstract class AbstractCompoundModelElement extends AbstractModelElement implements ICompoundModelElement
-{
-
-    private static final long serialVersionUID = 1L;
-
-    public AbstractCompoundModelElement(String description)
-    {
-        super(description);
-    }
-
-    public boolean addChild(IModelElement child) throws InvalidModelException
-    {
-        return support.addChild(child);
-    }
-
-    public boolean removeChild(IModelElement child)
-    {
-        return support.removeChild(child);
-    }
-
-    public IModelElement[] children()
-    {
-        return support.children();
-    }
-
-    private static final ThreadLocal<Map<IModelWalker, Set<IModelElement>>> walkedLocal = new ThreadLocal<Map<IModelWalker, Set<IModelElement>>>();
-
-    public void visit(IModelWalker walker)
-    {
-        if (walker.visit(this))
-        {
-            Map<IModelWalker, Set<IModelElement>> walked = walkedLocal.get();
-            boolean delete = false;
-
-            if (walked == null)
-            {
-                walked = new HashMap<IModelWalker, Set<IModelElement>>();
-                walkedLocal.set(walked);
-            }
-
-            Set<IModelElement> check = walked.get(walker);
-
-            if (check == null)
-            {
-                delete = true;
-                check = new HashSet<IModelElement>();
-            }
-
-            check.add(this);
-
-            try
-            {
-                for (IModelElement e : children())
-                {
-                    if (!check.contains(e) && walker.visit(e))
-                    {
-                        check.add(e);
-                        if (e instanceof ICompoundModelElement)
-                        {
-                            ICompoundModelElement c = (ICompoundModelElement) e;
-                            c.visit(walker);
-                        }
-                    }
-                }
-            }
-            finally
-            {
-                if (delete)
-                {
-                    walked.remove(walker);
-
-                    if (walked.isEmpty())
-                    {
-                        walkedLocal.set(null);
-                    }
-                }
-            }
-        }
-    }
-
-    public Set<Class<? extends IModelElement>> getOptionalChildren()
-    {
-        return support.getChildrenTypes(false);
-    }
-
-    public Set<Class<? extends IModelElement>> getRequiredChildren()
-    {
-        return support.getChildrenTypes(true);
-    }
-
-    public <T extends IModelElement> T[] childrenOfType(Class<T> type)
-    {
-        return support.childrenOfType(type);
-    }
-
-    @Override
-    public void checkValid() throws InvalidModelException
-    {
-        super.checkValid();
-
-        for (IModelElement e : support.children())
-        {
-            e.checkValid();
-        }
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/AbstractModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/AbstractModelElement.java
deleted file mode 100644
index ca2afe4..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/AbstractModelElement.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.sigil.common.model;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-public abstract class AbstractModelElement implements IModelElement
-{
-
-    private static final long serialVersionUID = 1L;
-
-    private IModelElement parent;
-
-    private String description;
-    private transient Map<Object, Object> meta;
-    private Map<Serializable, Serializable> serializedMeta;
-    private OverrideOptions override;
-
-    protected ModelElementSupport support;
-
-    public AbstractModelElement(String description)
-    {
-        support = new ModelElementSupport(this);
-        this.description = description.intern();
-    }
-
-    public String getElementDescription()
-    {
-        return description;
-    }
-
-    public Map<Object, Object> getMeta()
-    {
-        return meta == null ? Collections.emptyMap() : Collections.unmodifiableMap(meta);
-    }
-
-    public void setMeta(Map<Object, Object> meta)
-    {
-        this.meta = meta;
-    }
-
-    @Override
-    public AbstractModelElement clone()
-    {
-        try
-        {
-            AbstractModelElement clone = (AbstractModelElement) super.clone();
-
-            if (meta != null)
-            {
-                clone.meta = new HashMap<Object, Object>(meta);
-            }
-
-            clone.support = new ModelElementSupport(clone);
-
-            return clone;
-        }
-        catch (CloneNotSupportedException e)
-        {
-            // can't happen but make compiler happy
-            throw new IllegalStateException(e);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public <T extends IModelElement> T getAncestor(Class<T> type)
-    {
-        IModelElement parent = this.parent;
-
-        while (parent != null)
-        {
-            if (type.isInstance(parent))
-            {
-                return (T) parent;
-            }
-            parent = parent.getParent();
-        }
-
-        return null;
-    }
-
-    public IModelElement getParent()
-    {
-        return parent;
-    }
-
-    public void setParent(IModelElement parent)
-    {
-        if (parent != null)
-        {
-            if (this.parent != null && this.parent != parent)
-            {
-                throw new IllegalStateException("Parent already installed");
-            }
-        }
-
-        this.parent = parent;
-    }
-
-    public void checkValid() throws InvalidModelException
-    {
-        for (String req : getRequiredProperties())
-        {
-            try
-            {
-                if (getProperty(req) == null)
-                {
-                    throw new InvalidModelException(this, "Missing property " + req);
-                }
-            }
-            catch (NoSuchMethodException e)
-            {
-                throw new InvalidModelException(this, "No such property " + req);
-            }
-        }
-    }
-
-    public Object getProperty(String name) throws NoSuchMethodException
-    {
-        return support.getProperty(name);
-    }
-
-    public void setProperty(String name, Object value) throws NoSuchMethodException
-    {
-        support.setProperty(name, value);
-    }
-
-    public void addProperty(String name, Object value) throws NoSuchMethodException
-    {
-        support.addProperty(name, value);
-    }
-
-    public void removeProperty(String name, Object value) throws NoSuchMethodException
-    {
-        support.removeProperty(name, value);
-    }
-
-    public Object getDefaultPropertyValue(String name)
-    {
-        return support.getDefaultPropertyValue(name);
-    }
-
-    public Set<String> getPropertyNames()
-    {
-        return support.getPropertyNames();
-    }
-
-    public Set<String> getRequiredProperties()
-    {
-        return Collections.emptySet();
-    }
-
-    public Class<?> getPropertyType(String name) throws NoSuchMethodException
-    {
-        return support.getPropertyType(name);
-    }
-
-    protected Object writeReplace()
-    {
-        AbstractModelElement clone = clone();
-
-        if (clone.meta != null)
-        {
-            clone.serializedMeta = new HashMap<Serializable, Serializable>(
-                clone.meta.size());
-
-            for (Map.Entry<Object, Object> e : clone.meta.entrySet())
-            {
-                if (e.getKey() instanceof Serializable
-                    && e.getValue() instanceof Serializable)
-                {
-                    clone.serializedMeta.put((Serializable) e.getKey(),
-                        (Serializable) e.getValue());
-                }
-            }
-
-            clone.meta = null;
-        }
-
-        return clone;
-    }
-
-    protected Object readResolve()
-    {
-        meta = serializedMeta == null ? null
-            : new HashMap<Object, Object>(serializedMeta);
-        serializedMeta = null;
-        return this;
-    }
-
-    public OverrideOptions getOverride()
-    {
-        return override;
-    }
-
-    public void setOverride(OverrideOptions override)
-    {
-        this.override = override;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/ICapabilityModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/ICapabilityModelElement.java
deleted file mode 100644
index 17c830b..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/ICapabilityModelElement.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-public interface ICapabilityModelElement extends IModelElement
-{
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/ICompoundModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/ICompoundModelElement.java
deleted file mode 100644
index d2581a8..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/ICompoundModelElement.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.sigil.common.model;
-
-import java.util.Set;
-
-/**
- * Represents a model element that is made up of sub model elements.
- * 
- * @author dave
- *
- */
-public interface ICompoundModelElement extends IModelElement
-{
-    /**
-     * Calls the applicable set/add method of this model to add the element to this part of the model.
-     * 
-     * @param children
-     * @return
-     * @throws InvalidModelException
-     */
-    boolean addChild(IModelElement children) throws InvalidModelException;
-
-    /**
-     * Calls the applicable set/remove method of this model to remove the element from this part of the model
-     * @param children
-     * @return
-     */
-    boolean removeChild(IModelElement children);
-
-    /**
-     * List all direct child elements of this model element.
-     * @return
-     */
-    IModelElement[] children();
-
-    /**
-     * Visits child elements of this model element, recursing down to sub compound elements when found.
-     * 
-     * @param walker
-     */
-    void visit(IModelWalker walker);
-
-    /**
-     * Searches the model to find all child model elements which match the specified type
-     * 
-     * @param <T>
-     * @param type
-     * @return
-     */
-    <T extends IModelElement> T[] childrenOfType(Class<T> type);
-
-    Set<Class<? extends IModelElement>> getRequiredChildren();
-
-    Set<Class<? extends IModelElement>> getOptionalChildren();
-}
\ No newline at end of file
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/IModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/IModelElement.java
deleted file mode 100644
index 84e9145..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/IModelElement.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-import java.util.Map;
-import java.util.Set;
-
-/**
- * IModelElement represent static information about a part of a model.
- * 
- * @author dave
- * 
- */
-public interface IModelElement extends Cloneable
-{
-    /**
-     * A brief human readable description of the element.
-     * 
-     * @return
-     */
-    String getElementDescription();
-
-    /**
-     * A set of key value pairs designed for use by a machine to classify a particular element.
-     * 
-     * @return
-     */
-    Map<Object, Object> getMeta();
-
-    /**
-     * Set meta data on this descriptor. Meta data is designed for use by a machine to classify or further enhance a
-     * particular element.
-     * 
-     * @param meta
-     */
-    void setMeta(Map<Object, Object> meta);
-
-    /**
-     * Check to see if this element defines a complete set of properties. The definition of what constitutes a
-     * complete set is up to the implementing class.
-     * 
-     * @throws InvalidModelException
-     */
-    void checkValid() throws InvalidModelException;
-
-    /**
-     * Find the parent element of this model element or null if no parent exists.
-     * @return
-     */
-    IModelElement getParent();
-
-    void setParent(IModelElement parent);
-
-    /**
-     * Finds the first ancestor up the hierarch of parents which is an instance of the specified
-     * type.
-     * 
-     * @param type
-     * @return
-     */
-    <T extends IModelElement> T getAncestor(Class<T> type);
-
-    IModelElement clone();
-
-    Set<String> getPropertyNames();
-
-    void setProperty(String name, Object value) throws NoSuchMethodException;
-
-    void addProperty(String name, Object value) throws NoSuchMethodException;
-
-    void removeProperty(String name, Object value) throws NoSuchMethodException;
-
-    Object getProperty(String name) throws NoSuchMethodException;
-
-    Object getDefaultPropertyValue(String name);
-
-    Set<String> getRequiredProperties();
-
-    Class<?> getPropertyType(String name) throws NoSuchMethodException;
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/IModelInfo.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/IModelInfo.java
deleted file mode 100644
index 17993a7..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/IModelInfo.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-public interface IModelInfo
-{
-    String getGroupName();
-
-    String getGroupURI();
-
-    String getName();
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/IModelWalker.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/IModelWalker.java
deleted file mode 100644
index 931c72d..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/IModelWalker.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-/**
- * Visitor pattern to traverse nodes in the model.
- * 
- * @see ICompoundModelElement#visit(IModelWalker);
- * 
- * @author dave
- *
- */
-public interface IModelWalker
-{
-    /**
-     * Callback method providing the part of the model currently being visited.
-     * 
-     * @param element the element being visited
-     * 
-     * @return true to continue walking the model, false otherwise
-     */
-    boolean visit(IModelElement element);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/INamedModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/INamedModelElement.java
deleted file mode 100644
index 07c1664..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/INamedModelElement.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-public interface INamedModelElement extends IModelElement
-{
-    void setName(String name);
-
-    String getName();
-
-    OverrideOptions getOverride();
-
-    void setOverride(OverrideOptions override);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/IRequirementModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/IRequirementModelElement.java
deleted file mode 100644
index 2b197f6..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/IRequirementModelElement.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-public interface IRequirementModelElement extends IModelElement
-{
-    boolean accepts(ICapabilityModelElement provider);
-
-    /**
-     * indicates whether the OSGi attribute "resolution=optional" is specified.
-     */
-    boolean isOptional();
-
-    void setOptional(boolean optional);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/InvalidModelException.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/InvalidModelException.java
deleted file mode 100644
index 5f9740f..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/InvalidModelException.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-/**
- * @author dave
- * 
- */
-public class InvalidModelException extends RuntimeException
-{
-
-    private static final long serialVersionUID = 1L;
-
-    private IModelElement target;
-
-    public InvalidModelException(IModelElement target, String msg)
-    {
-        super(msg);
-        this.target = target;
-    }
-
-    public InvalidModelException(IModelElement target, String msg, Throwable t)
-    {
-        super(msg, t);
-        this.target = target;
-    }
-
-    public IModelElement getTarget()
-    {
-        return target;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/ModelElementFactory.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/ModelElementFactory.java
deleted file mode 100644
index 94d36c9..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/ModelElementFactory.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public abstract class ModelElementFactory
-{
-    static class ElementInfo
-    {
-        Class<? extends IModelElement> implType;
-        String name;
-        String groupName;
-        String groupURI;
-
-        public ElementInfo(Class<? extends IModelElement> implType, String name, String groupName, String groupURI)
-        {
-            this.implType = implType;
-            this.name = name;
-            this.groupName = groupName;
-            this.groupURI = groupURI;
-        }
-
-        public Class<? extends IModelElement> getImplType()
-        {
-            return implType;
-        }
-
-        public String getName()
-        {
-            return name;
-        }
-
-        public String getGroupName()
-        {
-            return groupName;
-        }
-
-        public String getGroupURI()
-        {
-            return groupURI;
-        }
-
-        public String toString()
-        {
-            return "ElementInfo[" + name + ":" + groupName + ":" + groupURI + ":"
-                + implType.getCanonicalName() + "]";
-        }
-    }
-
-    static class ModelInfo implements IModelInfo
-    {
-
-        private ElementInfo e;
-
-        public ModelInfo(ElementInfo e)
-        {
-            this.e = e;
-        }
-
-        public String getGroupName()
-        {
-            return e.getGroupName();
-        }
-
-        public String getGroupURI()
-        {
-            return e.getGroupURI();
-        }
-
-        public String getName()
-        {
-            return e.getName();
-        }
-
-    }
-
-    static class DefaultModelElementFactory extends ModelElementFactory
-    {
-        private HashMap<Class<? extends IModelElement>, ElementInfo> elementInfo = new HashMap<Class<? extends IModelElement>, ElementInfo>();
-
-        @SuppressWarnings("unchecked")
-        @Override
-        public <T extends IModelElement> T newModelElement(Class<T> type)
-            throws ModelElementFactoryException
-        {
-            ElementInfo info = elementInfo.get(type);
-            if (info == null)
-            {
-                throw new ModelElementFactoryException(
-                    "No implementation registered for " + type);
-            }
-            try
-            {
-                return (T) info.getImplType().newInstance();
-            }
-            catch (InstantiationException e)
-            {
-                throw new ModelElementFactoryException(e);
-            }
-            catch (IllegalAccessException e)
-            {
-                throw new ModelElementFactoryException(e);
-            }
-        }
-
-        @Override
-        public <T extends IModelElement> void register(Class<T> type,
-            Class<? extends T> impl, String name, String groupName, String groupURI)
-        {
-            elementInfo.put(type, new ElementInfo(impl, name, groupName, groupURI));
-        }
-
-        @Override
-        public <T extends IModelElement> void unregister(Class<T> type,
-            Class<? extends T> impl)
-        {
-            ElementInfo info = elementInfo.get(type);
-            if (info != null && info.getImplType() == impl)
-            {
-                elementInfo.remove(type);
-            }
-        }
-
-        @Override
-        public IModelInfo getModelInfo(Class<? extends IModelElement> type)
-        {
-            ElementInfo e = findElementInfo(type);
-
-            if (e == null)
-            {
-                return null;
-            }
-
-            return new ModelInfo(e);
-        }
-
-        @Override
-        public IModelElement newModelElement(String namespaceURI, String localPart)
-            throws ModelElementFactoryException
-        {
-            for (Map.Entry<Class<? extends IModelElement>, ElementInfo> e : elementInfo.entrySet())
-            {
-                ElementInfo i = e.getValue();
-                if (equal(namespaceURI, i.getGroupURI()) && equal(i.getName(), localPart))
-                {
-                    return newModelElement(e.getKey());
-                }
-            }
-
-            return null;
-        }
-
-        private boolean equal(String val1, String val2)
-        {
-            return val1 == null ? val2 == null : val1.equals(val2);
-        }
-
-        private ElementInfo findElementInfo(Class<? extends IModelElement> type)
-        {
-            for (ElementInfo e : elementInfo.values())
-            {
-                if (e.getImplType() == type)
-                {
-                    return e;
-                }
-            }
-
-            return null;
-        }
-
-    }
-
-    public abstract <T extends IModelElement> T newModelElement(Class<T> type)
-        throws ModelElementFactoryException;
-
-    public abstract IModelElement newModelElement(String namespaceURI, String localPart)
-        throws ModelElementFactoryException;
-
-    public abstract <T extends IModelElement> void register(Class<T> type,
-        Class<? extends T> impl, String name, String groupName, String groupURI);
-
-    public abstract <T extends IModelElement> void unregister(Class<T> type,
-        Class<? extends T> impl);
-
-    public abstract IModelInfo getModelInfo(Class<? extends IModelElement> type);
-
-    private static ModelElementFactory instance = new DefaultModelElementFactory();
-
-    public static ModelElementFactory getInstance()
-    {
-        return instance;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/ModelElementFactoryException.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/ModelElementFactoryException.java
deleted file mode 100644
index d6ea643..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/ModelElementFactoryException.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-public class ModelElementFactoryException extends RuntimeException
-{
-
-    private static final long serialVersionUID = 1L;
-
-    public ModelElementFactoryException(Throwable t)
-    {
-        super(t);
-    }
-
-    public ModelElementFactoryException(String msg)
-    {
-        super(msg);
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/ModelElementSupport.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/ModelElementSupport.java
deleted file mode 100644
index c5b49f8..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/ModelElementSupport.java
+++ /dev/null
@@ -1,933 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-import java.io.Serializable;
-import java.lang.ref.SoftReference;
-import java.lang.reflect.Array;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.UndeclaredThrowableException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.WeakHashMap;
-import java.util.logging.Logger;
-
-import org.apache.felix.sigil.common.model.annotations.Required;
-
-public class ModelElementSupport implements Serializable
-{
-
-    private static final Logger log = Logger.getLogger(ModelElementSupport.class.getName());
-
-    private static final long serialVersionUID = 1L;
-
-    private static final PropertyAdapter[] EMPTY_PROPS = new PropertyAdapter[] {};
-    private static final IModelElement[] EMPTY_ELEMENTS = new IModelElement[] {};
-    private static final Object[] ZERO_ARGS = new Object[] {};
-    private static final Class<?>[] ZERO_PARAMS = new Class[] {};
-
-    private static final WeakHashMap<Class<?>, SoftReference<ChildAdapter[]>> adapterCache = new WeakHashMap<Class<?>, SoftReference<ChildAdapter[]>>();;
-    private static final WeakHashMap<Class<?>, SoftReference<PropertyAdapter[]>> propertyCache = new WeakHashMap<Class<?>, SoftReference<PropertyAdapter[]>>();;
-
-    private IModelElement target;
-
-    private transient SoftReference<PropertyAdapter[]> propertyReference;
-    private transient SoftReference<ChildAdapter[]> childrenReference;
-    private transient SoftReference<Set<String>> propertyNameReference;
-
-    public ModelElementSupport(IModelElement target)
-    {
-        this.target = target;
-    }
-
-    public void setProperty(String name, Object value) throws NoSuchMethodException
-    {
-        PropertyAdapter p = findProperty(name, value);
-        if (p == null)
-        {
-            throw new NoSuchMethodException("No such property " + name + " for type "
-                + target.getClass());
-        }
-        invoke(target, p.getWriteMethod(), value);
-    }
-
-    public void addProperty(String name, Object value) throws NoSuchMethodException
-    {
-        PropertyAdapter p = findProperty(name, value);
-        if (p == null)
-        {
-            throw new NoSuchMethodException("No such property " + name + " for type "
-                + target.getClass());
-        }
-        invoke(target, p.getAddMethod(), value);
-    }
-
-    public void removeProperty(String name, Object value) throws NoSuchMethodException
-    {
-        PropertyAdapter p = findProperty(name, value);
-        if (p == null)
-        {
-            throw new NoSuchMethodException("No such property " + name + " for type "
-                + target.getClass());
-        }
-        invoke(target, p.getRemoveMethod(), value);
-    }
-
-    public Object getProperty(String name) throws NoSuchMethodException
-    {
-        PropertyAdapter p = findProperty(name, null);
-        if (p == null)
-        {
-            throw new NoSuchMethodException("No such property " + name + " for type "
-                + target.getClass());
-        }
-        return invoke(target, p.getReadMethod(), ZERO_ARGS);
-    }
-
-    public Set<String> getPropertyNames()
-    {
-        Set<String> names = propertyNameReference == null ? null
-            : propertyNameReference.get();
-
-        if (names == null)
-        {
-            names = new HashSet<String>();
-
-            PropertyAdapter[] props = cachedProps(target.getClass());
-            for (PropertyAdapter prop : props)
-            {
-                names.add(prop.getName());
-            }
-
-            propertyNameReference = new SoftReference<Set<String>>(names);
-        }
-
-        return names;
-    }
-
-    public Object getDefaultPropertyValue(String name)
-    {
-        try
-        {
-            Method m = target.getClass().getMethod(makeDefaultPropertyValue(name),
-                ZERO_PARAMS);
-            return invoke(target, m, ZERO_ARGS);
-        }
-        catch (SecurityException e)
-        {
-            throw new UndeclaredThrowableException(e);
-        }
-        catch (NoSuchMethodException e)
-        {
-            // fine no default
-            return null;
-        }
-    }
-
-    public Class<?> getPropertyType(String name) throws NoSuchMethodException
-    {
-        PropertyAdapter p = findProperty(name, null);
-        if (p == null)
-        {
-            throw new NoSuchMethodException("No such property " + name + " for type "
-                + target.getClass());
-        }
-        return p.getPropertyType();
-    }
-
-    @SuppressWarnings("unchecked")
-    public <T extends IModelElement> T[] childrenOfType(Class<T> type)
-    {
-        ChildAdapter[] adapters = cachedAdapters();
-
-        if (adapters.length == 0)
-        {
-            // return (T[]) EMPTY_ELEMENTS;
-            return ((T[]) Array.newInstance(type, 0));
-        }
-
-        ArrayList<T> elements = new ArrayList<T>();
-
-        for (ChildAdapter adapter : adapters)
-        {
-            Collection<? extends IModelElement> val = adapter.members(target);
-
-            for (IModelElement e : val)
-            {
-                if (type.isInstance(e))
-                {
-                    elements.add((T) e);
-                }
-            }
-        }
-
-        //return elements.toArray( (T[]) EMPTY_ELEMENTS );
-        return elements.toArray((T[]) Array.newInstance(type, elements.size()));
-    }
-
-    public IModelElement[] children()
-    {
-        ChildAdapter[] adapters = cachedAdapters();
-
-        if (adapters.length == 0)
-        {
-            return EMPTY_ELEMENTS;
-        }
-
-        ArrayList<IModelElement> elements = new ArrayList<IModelElement>();
-
-        for (ChildAdapter adapter : adapters)
-        {
-            elements.addAll(adapter.members(target));
-        }
-
-        return elements.toArray(EMPTY_ELEMENTS);
-    }
-
-    public boolean addChild(IModelElement element) throws InvalidModelException
-    {
-        if (element.getParent() == null)
-        {
-            ChildAdapter[] adapters = cachedAdapters();
-
-            if (adapters.length > 0)
-            {
-                for (ChildAdapter adapter : adapters)
-                {
-                    if (adapter.add(target, element))
-                    {
-                        element.setParent(target);
-                        return true;
-                    }
-                }
-            }
-        }
-
-        return false;
-    }
-
-    public boolean removeChild(IModelElement element)
-    {
-        if (element.getParent() == target)
-        {
-            ChildAdapter[] adapters = cachedAdapters();
-
-            if (adapters.length > 0)
-            {
-                for (ChildAdapter adapter : adapters)
-                {
-                    if (adapter.remove(target, element))
-                    {
-                        element.setParent(null);
-                        return true;
-                    }
-                }
-            }
-        }
-
-        return false;
-    }
-
-    public Set<Class<? extends IModelElement>> getChildrenTypes(boolean required)
-    {
-        ChildAdapter[] adapters = cachedAdapters();
-
-        if (adapters.length == 0)
-        {
-            return Collections.emptySet();
-        }
-
-        HashSet<Class<? extends IModelElement>> types = new HashSet<Class<? extends IModelElement>>();
-
-        for (ChildAdapter adapter : adapters)
-        {
-            if (adapter.isRequired() == required)
-            {
-                Class<? extends IModelElement> type = adapter.getType();
-
-                if (type != null)
-                {
-                    types.add(type);
-                }
-            }
-        }
-
-        return types;
-    }
-
-    private PropertyAdapter findProperty(String name, Object value)
-    {
-        PropertyAdapter[] props = propertyReference == null ? null
-            : propertyReference.get();
-
-        if (props == null)
-        {
-            props = cachedProps(target.getClass());
-            propertyReference = new SoftReference<PropertyAdapter[]>(props);
-        }
-
-        for (PropertyAdapter prop : props)
-        {
-            if (prop.getName().equals(name)
-                && (value == null || prop.getRawType().isAssignableFrom(value.getClass())))
-            {
-                return prop;
-            }
-        }
-
-        return null;
-    }
-
-    private static synchronized PropertyAdapter[] cachedProps(
-        Class<? extends IModelElement> type)
-    {
-        SoftReference<PropertyAdapter[]> ref = propertyCache.get(type);
-
-        PropertyAdapter[] props = ref == null ? null : ref.get();
-
-        if (props == null)
-        {
-            props = loadProps(type);
-            propertyCache.put(type, new SoftReference<PropertyAdapter[]>(props));
-        }
-
-        return props;
-    }
-
-    private static PropertyAdapter[] loadProps(Class<? extends IModelElement> type)
-    {
-        ArrayList<PropertyAdapter> props = new ArrayList<PropertyAdapter>();
-        for (Method m : type.getMethods())
-        {
-            if (isValidProperty(m))
-            {
-                try
-                {
-                    PropertyAdapter p = new PropertyAdapter(m, type);
-                    props.add(p);
-                }
-                catch (NoSuchMethodException e)
-                {
-                    // fine not a bean method
-                    log.finer("Invalid bean property method " + m + ": " + e.getMessage());
-                }
-            }
-        }
-
-        return props.toArray(EMPTY_PROPS);
-    }
-
-    private static boolean isValidProperty(Method m)
-    {
-        return m.getName().startsWith("get") && m.getParameterTypes().length == 0
-            && !m.getDeclaringClass().equals(Object.class)
-            && !IModelElement.class.isAssignableFrom(m.getReturnType());
-    }
-
-    private static String makeDefaultPropertyValue(String name)
-    {
-        return "getDefault" + capitalise(name);
-    }
-
-    private static String capitalise(String name)
-    {
-        return Character.toUpperCase(name.charAt(0)) + name.substring(1);
-    }
-
-    private static String decapitalise(String substring)
-    {
-        return Character.toLowerCase(substring.charAt(0)) + substring.substring(1);
-    }
-
-    private ChildAdapter[] cachedAdapters()
-    {
-        ChildAdapter[] adapters = childrenReference == null ? null
-            : childrenReference.get();
-
-        if (adapters == null)
-        {
-            adapters = loadAdapters(target);
-            childrenReference = new SoftReference<ChildAdapter[]>(adapters);
-        }
-
-        return adapters;
-    }
-
-    private static synchronized ChildAdapter[] loadAdapters(IModelElement target)
-    {
-        Class<? extends IModelElement> type = target.getClass();
-        SoftReference<ChildAdapter[]> ref = adapterCache.get(type);
-
-        ChildAdapter[] adapters = ref == null ? null : ref.get();
-
-        if (adapters == null)
-        {
-            adapters = buildAdapters(type);
-            adapterCache.put(type, new SoftReference<ChildAdapter[]>(adapters));
-        }
-
-        return adapters;
-    }
-
-    private static ChildAdapter[] buildAdapters(Class<? extends IModelElement> type)
-    {
-        ArrayList<ChildAdapter> adapters = new ArrayList<ChildAdapter>();
-
-        for (Method m : type.getMethods())
-        {
-            ChildAdapter adapter = null;
-
-            if (isValidGetProperty(m))
-            {
-                adapter = buildGetAdapter(m);
-            }
-            else if (isValidSetProperty(m))
-            {
-                adapter = buildSetAdapter(m);
-            }
-            else if (isValidAddProperty(m))
-            {
-                adapter = buildAddAdapter(m);
-            }
-            else if (isValidRemoveProperty(m))
-            {
-                adapter = buildRemoveAdapter(m);
-            }
-
-            if (adapter != null)
-            {
-                adapters.add(adapter);
-            }
-        }
-
-        return adapters.toArray(new ChildAdapter[adapters.size()]);
-    }
-
-    private static ChildAdapter buildGetAdapter(Method m)
-    {
-        if (IModelElement.class.isAssignableFrom(m.getReturnType()))
-        {
-            return new GetPropertyAdapter(m);
-        }
-        else if (Collection.class.isAssignableFrom(m.getReturnType()))
-        {
-            return new GetCollectionAdapter(m);
-        }
-        else if (isModelArray(m.getReturnType()))
-        {
-            return new GetArrayAdapter(m);
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    private static ChildAdapter buildSetAdapter(Method m)
-    {
-        if (IModelElement.class.isAssignableFrom(m.getParameterTypes()[0]))
-        {
-            return new SetPropertyAdapter(m);
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    private static ChildAdapter buildAddAdapter(Method m)
-    {
-        if (IModelElement.class.isAssignableFrom(m.getParameterTypes()[0]))
-        {
-            return new AddPropertyAdapter(m);
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    private static ChildAdapter buildRemoveAdapter(Method m)
-    {
-        if (IModelElement.class.isAssignableFrom(m.getParameterTypes()[0]))
-        {
-            return new RemovePropertyAdapter(m);
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    private static boolean isValidRemoveProperty(Method m)
-    {
-        return m.getParameterTypes().length == 1 && m.getName().startsWith("remove")
-            && !isDeclared(ICompoundModelElement.class, m);
-    }
-
-    private static boolean isValidAddProperty(Method m)
-    {
-        return m.getParameterTypes().length == 1 && m.getName().startsWith("add")
-            && !isDeclared(ICompoundModelElement.class, m);
-    }
-
-    private static boolean isDeclared(Class<? extends IModelElement> element, Method m)
-    {
-        try
-        {
-            element.getMethod(m.getName(), m.getParameterTypes());
-            return true;
-        }
-        catch (SecurityException e)
-        {
-            throw new UndeclaredThrowableException(e);
-        }
-        catch (NoSuchMethodException e)
-        {
-            return false;
-        }
-    }
-
-    private static boolean isValidSetProperty(Method m)
-    {
-        return m.getParameterTypes().length == 1 && m.getName().startsWith("set")
-            && !isDeclared(IModelElement.class, m);
-    }
-
-    private static boolean isValidGetProperty(Method m)
-    {
-        return m.getParameterTypes().length == 0 && m.getName().startsWith("get")
-            && !isDeclared(IModelElement.class, m)
-            && !isDeclared(ICompoundModelElement.class, m);
-    }
-
-    private static Object invoke(Object target, Method m, Object... args)
-    {
-        try
-        {
-            return m.invoke(target, args);
-        }
-        catch (IllegalArgumentException e)
-        {
-            // this should already have been tested
-            throw new IllegalStateException(e);
-        }
-        catch (IllegalAccessException e)
-        {
-            throw new UndeclaredThrowableException(e);
-        }
-        catch (InvocationTargetException e)
-        {
-            throw new UndeclaredThrowableException(e.getCause());
-        }
-    }
-
-    private static class PropertyAdapter
-    {
-
-        String prop;
-        String name;
-        Method g;
-        Method s;
-        Method a;
-        Method r;
-        Class<?> propertyType;
-
-        public PropertyAdapter(Method g, Class<?> type) throws SecurityException, NoSuchMethodException
-        {
-            if (g.getReturnType().isArray()
-                || Iterable.class.isAssignableFrom(g.getReturnType()))
-            {
-                prop = g.getName().substring(3);
-                // remove trailing s - as in addWibble, removeWibble, getWibbles
-                prop = prop.substring(0, prop.length() - 1);
-                name = decapitalise(prop);
-                a = find("add", prop, g.getReturnType(), type);
-                propertyType = a.getParameterTypes()[0];
-                r = find("remove", prop, g.getReturnType(), type);
-                if (r.getParameterTypes()[0] != propertyType)
-                {
-                    throw new NoSuchMethodException(
-                        "Add remove property method types do not match");
-                }
-                propertyType = Array.newInstance(propertyType, 0).getClass();
-            }
-            else
-            {
-                prop = g.getName().substring(3);
-                name = decapitalise(prop);
-                propertyType = g.getReturnType();
-                s = find("set", prop, propertyType, type);
-            }
-
-            this.g = g;
-        }
-
-        public Class<?> getRawType()
-        {
-            return propertyType.isArray() ? propertyType.getComponentType()
-                : propertyType;
-        }
-
-        public Class<?> getPropertyType()
-        {
-            return propertyType;
-        }
-
-        public Method getReadMethod()
-        {
-            return g;
-        }
-
-        public Method getAddMethod() throws NoSuchMethodException
-        {
-            if (a == null)
-            {
-                throw new NoSuchMethodException("No such method add" + prop);
-            }
-
-            return a;
-        }
-
-        public Method getRemoveMethod() throws NoSuchMethodException
-        {
-            if (r == null)
-            {
-                throw new NoSuchMethodException("No such method remove" + prop);
-            }
-
-            return r;
-        }
-
-        public Method getWriteMethod() throws NoSuchMethodException
-        {
-            if (s == null)
-            {
-                throw new NoSuchMethodException("No such method set" + prop);
-            }
-
-            return s;
-        }
-
-        @Override
-        public String toString()
-        {
-            return "PropertyAdapter[" + name + "]";
-        }
-
-        private Method find(String prefix, String prop, Class<?> returnType, Class<?> type)
-            throws SecurityException, NoSuchMethodException
-        {
-            String methodName = prefix + prop;
-
-            if (returnType.isArray())
-            {
-                Class<?> t = returnType.getComponentType();
-                return type.getMethod(methodName, new Class[] { t });
-            }
-            else if (Iterable.class.isAssignableFrom(returnType))
-            {
-                Method f = null;
-                for (Method m : type.getMethods())
-                {
-                    if (m.getParameterTypes().length == 1
-                        && m.getName().equals(methodName)
-                        && !IModelElement.class.isAssignableFrom(m.getParameterTypes()[0]))
-                    {
-                        if (f == null)
-                        {
-                            f = m;
-                        }
-                        else
-                        {
-                            throw new NoSuchMethodException("Found duplicate "
-                                + methodName);
-                        }
-                    }
-                }
-                if (f == null)
-                {
-                    throw new NoSuchMethodException("No such method " + methodName);
-                }
-
-                return f;
-            }
-            else
-            {
-                return type.getMethod(methodName, new Class[] { returnType });
-            }
-        }
-
-        public String getName()
-        {
-            return name;
-        }
-
-    }
-
-    private static abstract class ChildAdapter
-    {
-        Method m;
-
-        ChildAdapter(Method m)
-        {
-            this.m = m;
-        }
-
-        public boolean isRequired()
-        {
-            return m.isAnnotationPresent(Required.class);
-        }
-
-        boolean add(Object target, IModelElement element)
-        {
-            return false;
-        }
-
-        abstract Class<IModelElement> getType();
-
-        boolean remove(Object target, IModelElement element)
-        {
-            return false;
-        }
-
-        Collection<? extends IModelElement> members(Object target)
-        {
-            return Collections.emptyList();
-        }
-
-        @Override
-        public String toString()
-        {
-            return "ChildAdapter[ " + m.getName() + "]";
-        }
-    }
-
-    private static class GetPropertyAdapter extends ChildAdapter
-    {
-        GetPropertyAdapter(Method m)
-        {
-            super(m);
-        }
-
-        @Override
-        Collection<? extends IModelElement> members(Object target)
-        {
-            IModelElement member = (IModelElement) invoke(target, m, ZERO_ARGS);
-            if (member == null)
-            {
-                return Collections.emptyList();
-            }
-            else
-            {
-                return Collections.<IModelElement> singleton(member);
-            }
-        }
-
-        @SuppressWarnings("unchecked")
-        @Override
-        Class<IModelElement> getType()
-        {
-            return (Class<IModelElement>) m.getReturnType();
-        }
-    }
-
-    private static class GetCollectionAdapter extends ChildAdapter
-    {
-        public GetCollectionAdapter(Method m)
-        {
-            super(m);
-        }
-
-        @SuppressWarnings("unchecked")
-        @Override
-        Collection<? extends IModelElement> members(Object target)
-        {
-            Collection members = (Collection) invoke(target, m, ZERO_ARGS);
-            if (members == null)
-            {
-                return Collections.emptyList();
-            }
-            else
-            {
-                ArrayList<IModelElement> safe = new ArrayList<IModelElement>(
-                    members.size());
-                for (Object o : members)
-                {
-                    if (o instanceof IModelElement)
-                    {
-                        safe.add((IModelElement) o);
-                    }
-                }
-                return safe;
-            }
-        }
-
-        @Override
-        Class<IModelElement> getType()
-        {
-            // impossible to get type of a collection as erasure removes generics info
-            return null;
-        }
-
-    }
-
-    private static class GetArrayAdapter extends ChildAdapter
-    {
-        public GetArrayAdapter(Method m)
-        {
-            super(m);
-        }
-
-        @Override
-        Collection<? extends IModelElement> members(Object target)
-        {
-            IModelElement[] array = (IModelElement[]) invoke(target, m, ZERO_ARGS);
-            if (array == null || array.length == 0)
-            {
-                return Collections.emptyList();
-            }
-            else
-            {
-                return (Collection<? extends IModelElement>) Arrays.asList(array);
-            }
-        }
-
-        @SuppressWarnings("unchecked")
-        @Override
-        Class<IModelElement> getType()
-        {
-            return (Class<IModelElement>) m.getReturnType().getComponentType();
-        }
-    }
-
-    private static class SetPropertyAdapter extends ChildAdapter
-    {
-        public SetPropertyAdapter(Method m)
-        {
-            super(m);
-        }
-
-        @Override
-        boolean add(Object target, IModelElement element)
-        {
-            if (m.getParameterTypes()[0].isAssignableFrom(element.getClass()))
-            {
-                invoke(target, m, new Object[] { element });
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-
-        @Override
-        boolean remove(Object target, IModelElement element)
-        {
-            if (m.getParameterTypes()[0].isAssignableFrom(element.getClass()))
-            {
-                invoke(target, m, new Object[] { null });
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-
-        @SuppressWarnings("unchecked")
-        @Override
-        Class<IModelElement> getType()
-        {
-            return (Class<IModelElement>) m.getParameterTypes()[0];
-        }
-    }
-
-    private static class AddPropertyAdapter extends ChildAdapter
-    {
-        public AddPropertyAdapter(Method m)
-        {
-            super(m);
-        }
-
-        @Override
-        boolean add(Object target, IModelElement element)
-        {
-            if (m.getParameterTypes()[0].isAssignableFrom(element.getClass()))
-            {
-                invoke(target, m, new Object[] { element });
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-
-        @SuppressWarnings("unchecked")
-        @Override
-        Class<IModelElement> getType()
-        {
-            return (Class<IModelElement>) m.getParameterTypes()[0];
-        }
-    }
-
-    private static class RemovePropertyAdapter extends ChildAdapter
-    {
-
-        public RemovePropertyAdapter(Method m)
-        {
-            super(m);
-        }
-
-        @Override
-        boolean remove(Object target, IModelElement element)
-        {
-            if (m.getParameterTypes()[0].isAssignableFrom(element.getClass()))
-            {
-                invoke(target, m, new Object[] { element });
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-
-        @SuppressWarnings("unchecked")
-        @Override
-        Class<IModelElement> getType()
-        {
-            return (Class<IModelElement>) m.getParameterTypes()[0];
-        }
-    }
-
-    private static boolean isModelArray(Class<?> returnType)
-    {
-        return returnType.isArray()
-            && IModelElement.class.isAssignableFrom(returnType.getComponentType());
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/OverrideOptions.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/OverrideOptions.java
deleted file mode 100644
index 66a60f9..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/OverrideOptions.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author dave
- * 
- */
-public enum OverrideOptions
-{
-    NO("no"), MAY("may"), MUST("must");
-
-    private String str;
-
-    private static Map<String, OverrideOptions> map = new HashMap<String, OverrideOptions>();
-
-    static
-    {
-        for (OverrideOptions option : OverrideOptions.values())
-        {
-            map.put(option.str.toLowerCase(), option);
-        }
-    }
-
-    private OverrideOptions(String str)
-    {
-        this.str = str;
-    }
-
-    public static OverrideOptions parse(String val)
-    {
-        OverrideOptions option = map.get(val.toLowerCase());
-
-        if (option == null)
-        {
-            throw new IllegalArgumentException("Invalid override value " + val);
-        }
-
-        return option;
-    }
-
-    @Override
-    public String toString()
-    {
-        return str;
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/annotations/Required.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/annotations/Required.java
deleted file mode 100644
index 592c21b..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/annotations/Required.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Inherited
-@Documented
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface Required
-{
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/IBundleCapability.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/IBundleCapability.java
deleted file mode 100644
index 5765be9..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/IBundleCapability.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.common.model.eclipse;
-
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.osgi.framework.Version;
-
-public interface IBundleCapability extends ICapabilityModelElement
-{
-    String getSymbolicName();
-
-    Version getVersion();
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/ILibrary.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/ILibrary.java
deleted file mode 100644
index d333fe1..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/ILibrary.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.eclipse;
-
-import java.util.Collection;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.osgi.framework.Version;
-
-public interface ILibrary extends IModelElement
-{
-    String getName();
-
-    void setName(String name);
-
-    Version getVersion();
-
-    void setVersion(Version version);
-
-    void addImport(IPackageImport pi);
-
-    void removeImport(IPackageImport pi);
-
-    Collection<IPackageImport> getImports();
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/ILibraryImport.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/ILibraryImport.java
deleted file mode 100644
index c1818f9..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/ILibraryImport.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.eclipse;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-
-public interface ILibraryImport extends IModelElement
-{
-    String getLibraryName();
-
-    void setLibraryName(String name);
-
-    VersionRange getVersions();
-
-    void setVersions(VersionRange range);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/ISigilBundle.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/ISigilBundle.java
deleted file mode 100644
index a597ac9..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/eclipse/ISigilBundle.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.eclipse;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-
-import org.apache.felix.sigil.common.config.Resource;
-import org.apache.felix.sigil.common.model.ICompoundModelElement;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IVersionedModelElement;
-import org.apache.felix.sigil.common.progress.IProgress;
-
-/**
- * @author dave
- *
- */
-public interface ISigilBundle extends ICompoundModelElement, IVersionedModelElement
-{
-    void synchronize(IProgress progress) throws IOException;
-
-    boolean isSynchronized();
-
-    IBundleModelElement getBundleInfo();
-
-    String getSymbolicName();
-
-    void setBundleInfo(IBundleModelElement bundle);
-
-    // TODO rename this method...
-    void addSourcePath(Resource path);
-
-    void removeSourcePath(Resource path);
-
-    Collection<Resource> getSourcePaths();
-
-    void clearSourcePaths();
-
-    Collection<String> getClasspathEntrys();
-
-    void addClasspathEntry(String encodedClasspath);
-
-    void removeClasspathEntry(String encodedClasspath);
-
-    // XXX must be file due to SiglCore.isBundlePath
-    File getLocation();
-
-    // XXX must be file due to SiglCore.isBundlePath
-    void setLocation(File location);
-
-    File getSourcePathLocation();
-
-    void setSourcePathLocation(File location);
-
-    String getSourceRootPath();
-
-    void setSourceRootPath(String location);
-
-    void setLicencePathLocation(File cacheSourceLocation);
-
-    File getLicencePathLocation();
-
-    /**
-     * get package names included in bundle.
-     * Can contain wildcards e.g. org.foo.*
-     */
-    Collection<String> getPackages();
-
-    /**
-     * remove package name from those included in bundle.
-     */
-    boolean removePackage(String pkg);
-
-    /**
-     * add package name to be included in bundle.
-     */
-    void addPackage(String pkg);
-
-    /**
-     * Attempt to find a package export that matches the given name or return null if none specified
-     * 
-     * @param elementName
-     * @return
-     */
-    IPackageExport findExport(String elementName);
-
-    /**
-     * Attempt to find a package import that matches the given name or return null if none specified
-     * @param packageName
-     * @return
-     */
-    IPackageImport findImport(String packageName);
-
-    IBundleCapability getBundleCapability();
-}
\ No newline at end of file
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IBundleModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IBundleModelElement.java
deleted file mode 100644
index 653f683..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IBundleModelElement.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.osgi;
-
-import java.net.URI;
-import java.util.Collection;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.ICompoundModelElement;
-import org.apache.felix.sigil.common.model.INamedModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ILibraryImport;
-import org.osgi.framework.Version;
-
-public interface IBundleModelElement extends INamedModelElement, ICompoundModelElement, IVersionedModelElement
-{
-
-    String getActivator();
-
-    void setActivator(String activator);
-
-    String getCategory();
-
-    void setCategory(String category);
-
-    String getContactAddress();
-
-    void setContactAddress(String contactAddress);
-
-    String getCopyright();
-
-    void setCopyright(String copyright);
-
-    URI getDocURI();
-
-    void setDocURI(URI docURI);
-
-    Collection<IPackageExport> getExports();
-
-    void addExport(IPackageExport packageExport);
-
-    void removeExport(IPackageExport packageExport);
-
-    Collection<IPackageImport> getImports();
-
-    void addImport(IPackageImport packageImport);
-
-    void removeImport(IPackageImport packageImport);
-
-    Collection<IRequiredBundle> getRequiredBundles();
-
-    void addRequiredBundle(IRequiredBundle bundle);
-
-    void removeRequiredBundle(IRequiredBundle bundle);
-
-    void addLibraryImport(ILibraryImport library);
-
-    void removeLibraryImport(ILibraryImport library);
-
-    Set<ILibraryImport> getLibraryImports();
-
-    URI getLicenseURI();
-
-    void setLicenseURI(URI licenseURI);
-
-    URI getSourceLocation();
-
-    void setSourceLocation(URI sourceLocation);
-
-    String getSymbolicName();
-
-    void setSymbolicName(String symbolicName);
-
-    URI getUpdateLocation();
-
-    void setUpdateLocation(URI updateLocation);
-
-    String getVendor();
-
-    void setVendor(String vendor);
-
-    Version getVersion();
-
-    void setVersion(Version version);
-
-    void setDescription(String elementText);
-
-    String getDescription();
-
-    Collection<String> getClasspaths();
-
-    void addClasspath(String path);
-
-    void removeClasspath(String path);
-
-    void setFragmentHost(IRequiredBundle fragmentHost);
-
-    IRequiredBundle getFragmentHost();
-}
\ No newline at end of file
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IPackageExport.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IPackageExport.java
deleted file mode 100644
index 5f27980..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IPackageExport.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.osgi;
-
-import java.util.Collection;
-
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.osgi.framework.Version;
-
-public interface IPackageExport extends IPackageModelElement, IVersionedModelElement, Comparable<IPackageExport>, ICapabilityModelElement
-{
-    void addUse(String uses);
-
-    void removeUse(String uses);
-
-    Collection<String> getUses();
-
-    void setUses(Collection<String> asList);
-
-    Version getRawVersion();
-}
\ No newline at end of file
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IPackageImport.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IPackageImport.java
deleted file mode 100644
index 2ddc6dd..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IPackageImport.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.osgi;
-
-import org.apache.felix.sigil.common.model.IRequirementModelElement;
-
-public interface IPackageImport extends IPackageModelElement, IVersionRangeModelElement, IRequirementModelElement, Comparable<IPackageImport>
-{
-    /**
-     * indicates whether import is needed at compile-time.
-     * Default true. Used in conjunction with OSGiHeader.ALWAYS,
-     * to add an OSGI import, without creating a dependency.
-     */
-    boolean isDependency();
-
-    void setDependency(boolean dependency);
-
-    /**
-     * indicates whether import should be added to OSGi Package-Import header.
-     * Default: AUTO.
-     */
-    OSGiImport getOSGiImport();
-
-    void setOSGiImport(OSGiImport osgiImport);
-
-    enum OSGiImport
-    {
-        /**
-         * only add to OSGi header, if it appears to be needed.
-         */
-        AUTO,
-
-        /**
-         * always add to OSGi header, even if it appears unnecessary.
-         */
-        ALWAYS,
-
-        /**
-         * never add to OSGi header.
-         */
-        NEVER
-    }
-}
\ No newline at end of file
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IPackageModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IPackageModelElement.java
deleted file mode 100644
index e236e4e..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IPackageModelElement.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.osgi;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-
-public interface IPackageModelElement extends IModelElement
-{
-
-    String getPackageName();
-
-    void setPackageName(String packageName);
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IRequiredBundle.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IRequiredBundle.java
deleted file mode 100644
index 9c706a0..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IRequiredBundle.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.osgi;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.IRequirementModelElement;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-
-public interface IRequiredBundle extends IModelElement, IRequirementModelElement, Comparable<IRequiredBundle>
-{
-    String getSymbolicName();
-
-    void setSymbolicName(String symbolicName);
-
-    VersionRange getVersions();
-
-    void setVersions(VersionRange versions);
-}
\ No newline at end of file
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IVersionRangeModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IVersionRangeModelElement.java
deleted file mode 100644
index fe069ad..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IVersionRangeModelElement.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.osgi;
-
-import org.apache.felix.sigil.common.osgi.VersionRange;
-
-public interface IVersionRangeModelElement
-{
-
-    VersionRange getVersions();
-
-    void setVersions(VersionRange version);
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IVersionedModelElement.java b/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IVersionedModelElement.java
deleted file mode 100644
index 8b88b13..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/model/osgi/IVersionedModelElement.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.model.osgi;
-
-import org.osgi.framework.Version;
-
-public interface IVersionedModelElement
-{
-
-    Version getVersion();
-
-    void setVersion(Version version);
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/progress/IProgress.java b/sigil/common/core/src/org/apache/felix/sigil/common/progress/IProgress.java
deleted file mode 100644
index 93a8dc1..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/progress/IProgress.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.progress;
-
-/**
- * @author dave
- *
- */
-public interface IProgress
-{
-
-    /**
-     * @return
-     */
-    boolean isCanceled();
-
-    /**
-     * @param totalWork
-     * @return
-     */
-    IProgress newChild(int totalWork);
-    
-    /**
-     * @param name
-     * @param totalWork
-     * @return
-     */
-    IProgress newTask(int totalWork);
-    
-    /**
-     * @param msg
-     */
-    void report(String msg);
-
-    /**
-     * @param work
-     */
-    void worked(int work);
-
-    /**
-     * 
-     */
-    void done();
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/AbstractBundleRepository.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/AbstractBundleRepository.java
deleted file mode 100644
index d0d1e80..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/AbstractBundleRepository.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.core.licence.ILicenseManager;
-import org.apache.felix.sigil.common.core.licence.ILicensePolicy;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ILibrary;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-
-public abstract class AbstractBundleRepository implements IBundleRepository
-{
-
-    private final String id;
-    private final HashSet<IBundleRepositoryListener> listeners = new HashSet<IBundleRepositoryListener>();
-
-    public AbstractBundleRepository(String id)
-    {
-        this.id = id;
-    }
-
-    public abstract void accept(IRepositoryVisitor visitor, int options);
-
-    public void addBundleRepositoryListener(IBundleRepositoryListener listener)
-    {
-        synchronized (listeners)
-        {
-            listeners.add(listener);
-        }
-    }
-
-    public void removeBundleRepositoryListener(IBundleRepositoryListener listener)
-    {
-        synchronized (listeners)
-        {
-            listeners.remove(listener);
-        }
-    }
-
-    protected void notifyChange()
-    {
-        for (IBundleRepositoryListener l : listeners)
-        {
-            l.notifyChange(this);
-        }
-    }
-
-    public String getId()
-    {
-        return id;
-    }
-
-    public void accept(IRepositoryVisitor visitor)
-    {
-        accept(visitor, 0);
-    }
-
-    public void writeOBR(OutputStream out) throws IOException
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    public Collection<ISigilBundle> findProviders(final ILibrary library, int options)
-    {
-        final ArrayList<ISigilBundle> found = new ArrayList<ISigilBundle>();
-
-        final ILicensePolicy policy = findPolicy(library);
-
-        IRepositoryVisitor visitor = new IRepositoryVisitor()
-        {
-            public boolean visit(ISigilBundle bundle)
-            {
-                if (policy.accept(bundle))
-                {
-                    IBundleModelElement info = bundle.getBundleInfo();
-                    for (IPackageImport pi : library.getImports())
-                    {
-                        for (IPackageExport e : info.getExports())
-                        {
-                            if (pi.getPackageName().equals(e.getPackageName())
-                                && pi.getVersions().contains(e.getVersion()))
-                            {
-                                found.add(bundle);
-                                break;
-                            }
-                        }
-                    }
-                }
-                return true;
-            }
-        };
-
-        accept(visitor, options);
-
-        return found;
-    }
-
-    public Collection<ISigilBundle> findAllProviders(final IRequiredBundle req,
-        int options)
-    {
-        final ArrayList<ISigilBundle> found = new ArrayList<ISigilBundle>();
-
-        final ILicensePolicy policy = findPolicy(req);
-
-        IRepositoryVisitor visitor = new IRepositoryVisitor()
-        {
-            public boolean visit(ISigilBundle bundle)
-            {
-                if (policy.accept(bundle))
-                {
-                    IBundleModelElement info = bundle.getBundleInfo();
-                    if (req.getSymbolicName().equals(info.getSymbolicName())
-                        && req.getVersions().contains(info.getVersion()))
-                    {
-                        found.add(bundle);
-                    }
-                }
-                return true;
-            }
-        };
-
-        accept(visitor, options);
-
-        return found;
-    }
-
-    public Collection<ISigilBundle> findAllProviders(final IPackageImport pi, int options)
-    {
-        final ArrayList<ISigilBundle> found = new ArrayList<ISigilBundle>();
-
-        final ILicensePolicy policy = findPolicy(pi);
-
-        IRepositoryVisitor visitor = new IRepositoryVisitor()
-        {
-
-            public boolean visit(ISigilBundle bundle)
-            {
-                if (policy.accept(bundle))
-                {
-                    IBundleModelElement info = bundle.getBundleInfo();
-                    if (info != null)
-                    {
-                        for (IPackageExport e : info.getExports())
-                        {
-                            if (pi.getPackageName().equals(e.getPackageName()))
-                            {
-                                if (pi.getVersions().contains(e.getVersion()))
-                                {
-                                    found.add(bundle);
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                }
-                return true;
-            }
-
-        };
-
-        accept(visitor, options);
-
-        return found;
-    }
-
-    public ISigilBundle findProvider(final IPackageImport pi, int options)
-    {
-        final ArrayList<ISigilBundle> found = new ArrayList<ISigilBundle>();
-
-        final ILicensePolicy policy = findPolicy(pi);
-
-        IRepositoryVisitor visitor = new IRepositoryVisitor()
-        {
-            public boolean visit(ISigilBundle bundle)
-            {
-                if (policy.accept(bundle))
-                {
-                    IBundleModelElement info = bundle.getBundleInfo();
-                    for (IPackageExport e : info.getExports())
-                    {
-                        if (pi.getPackageName().equals(e.getPackageName())
-                            && pi.getVersions().contains(e.getVersion()))
-                        {
-                            found.add(bundle);
-                            return false;
-                        }
-                    }
-                }
-                return true;
-            }
-
-        };
-
-        accept(visitor, options);
-
-        return found.isEmpty() ? null : found.iterator().next();
-    }
-
-    public ISigilBundle findProvider(final IRequiredBundle req, int options)
-    {
-        final ArrayList<ISigilBundle> found = new ArrayList<ISigilBundle>();
-
-        final ILicensePolicy policy = findPolicy(req);
-
-        IRepositoryVisitor visitor = new IRepositoryVisitor()
-        {
-
-            public boolean visit(ISigilBundle bundle)
-            {
-                if (policy.accept(bundle))
-                {
-                    IBundleModelElement info = bundle.getBundleInfo();
-                    if (req.getSymbolicName().equals(info.getSymbolicName())
-                        && req.getVersions().contains(info.getVersion()))
-                    {
-                        found.add(bundle);
-                        return false;
-                    }
-                }
-                return true;
-            }
-
-        };
-
-        accept(visitor, options);
-
-        return found.isEmpty() ? null : found.iterator().next();
-    }
-
-    protected ILicensePolicy findPolicy(IModelElement elem)
-    {
-        ILicenseManager man = BldCore.getLicenseManager();
-
-        /*		ISigilProjectModel p = elem.getAncestor(ISigilProjectModel.class);
-        		
-        		ILicensePolicy policy = null;
-        		
-        		if ( p != null ) {
-        			policy = man.getPolicy(p);
-        		}
-        		else {
-        			policy = man.getDefaultPolicy();
-        		}
-        		
-        		return policy; */
-
-        return man.getDefaultPolicy();
-    }
-}
\ No newline at end of file
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/AbstractRepositoryManager.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/AbstractRepositoryManager.java
deleted file mode 100644
index 7032f68..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/AbstractRepositoryManager.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.common.core.repository.BundleResolver;
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.common.model.eclipse.ILibrary;
-import org.apache.felix.sigil.common.model.eclipse.ILibraryImport;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.repository.RepositoryChangeEvent.Type;
-
-public abstract class AbstractRepositoryManager implements IRepositoryManager, IBundleRepositoryListener
-{
-
-    private HashSet<IRepositoryChangeListener> listeners = new HashSet<IRepositoryChangeListener>();
-
-    private boolean initialised;
-
-    private final HashMap<String, IBundleRepository> repositories = new HashMap<String, IBundleRepository>();
-    private final ArrayList<IBundleRepository> order = new ArrayList<IBundleRepository>();
-    private final TreeMap<Integer, HashSet<IBundleRepository>> levelMap = new TreeMap<Integer, HashSet<IBundleRepository>>();
-    private final ArrayList<ILibrary> libraries = new ArrayList<ILibrary>();
-    
-    private final BundleResolver resolver = new BundleResolver(this);
-
-    private int[] levels;
-
-    private final IRepositoryConfig config;
-    
-    public AbstractRepositoryManager(IRepositoryConfig config) {
-        this.config = config;
-    }
-    
-    /**
-     * @return
-     */
-    protected IRepositoryConfig getConfig()
-    {
-        return config;
-    }
-
-    public void initialise()
-    {
-        synchronized (repositories)
-        {
-            if (!initialised)
-            {
-                initialised = true;
-                loadRepositories();
-            }
-        }
-    }
-
-    protected abstract void loadRepositories();
-
-    public void addRepositoryChangeListener(IRepositoryChangeListener listener)
-    {
-        synchronized (listeners)
-        {
-            listeners.add(listener);
-        }
-    }
-
-    public void removeRepositoryChangeListener(IRepositoryChangeListener listener)
-    {
-        synchronized (listeners)
-        {
-            listeners.remove(listener);
-        }
-    }
-
-    public void notifyChange(IBundleRepository repository)
-    {
-        
-        notifyListeners(new RepositoryChangeEvent(repository, Type.CHANGED));
-    }
-
-    private void notifyListeners(RepositoryChangeEvent event)
-    {
-        ArrayList<IRepositoryChangeListener> safe = null;
-        synchronized (listeners)
-        {
-            safe = new ArrayList<IRepositoryChangeListener>(listeners);
-        }
-        for (IRepositoryChangeListener l : safe)
-        {
-            l.repositoryChanged(event);
-        }
-    }
-
-    protected void setRepositories(IBundleRepository[] repos)
-    {
-        synchronized (repositories)
-        {
-            repositories.clear();
-            order.clear();
-            levelMap.clear();
-            resetLevels();
-            if (repos != null)
-            {
-                for (int i = 0; i < repos.length; i++)
-                {
-                    addRepository(repos[i], i);
-                }
-            }
-        }
-    }
-
-    private void addRepository(IBundleRepository rep, int level)
-    {
-        Type type = null;
-
-        synchronized (repositories)
-        {
-            IBundleRepository old = repositories.put(rep.getId(), rep);
-            if (old == null)
-            {
-                type = Type.ADDED;
-                rep.addBundleRepositoryListener(this);
-            }
-            else
-            {
-                old.removeBundleRepositoryListener(this);
-                type = Type.CHANGED;
-                order.remove(old);
-                clearLevel(rep);
-            }
-
-            order.add(rep);
-
-            HashSet<IBundleRepository> set = levelMap.get(level);
-
-            if (set == null)
-            {
-                set = new HashSet<IBundleRepository>();
-                levelMap.put(level, set);
-            }
-
-            set.add(rep);
-            resetLevels();
-        }
-
-        notifyListeners(new RepositoryChangeEvent(rep, type));
-    }
-
-    private void clearLevel(IBundleRepository rep)
-    {
-        for (Iterator<Map.Entry<Integer, HashSet<IBundleRepository>>> iter = levelMap.entrySet().iterator(); iter.hasNext();)
-        {
-            Map.Entry<Integer, HashSet<IBundleRepository>> e = iter.next();
-            if (e.getValue().remove(rep))
-            {
-                if (e.getValue().isEmpty())
-                {
-                    iter.remove();
-                }
-                break;
-            }
-        }
-    }
-
-    public Collection<IBundleRepository> getRepositories()
-    {
-        initialise();
-        ArrayList<IBundleRepository> safe = null;
-
-        synchronized (repositories)
-        {
-            safe = new ArrayList<IBundleRepository>(order);
-        }
-
-        return safe;
-    }
-
-    private void resetLevels()
-    {
-        Collections.sort(order, new Comparator<IBundleRepository>()
-        {
-            public int compare(IBundleRepository o1, IBundleRepository o2)
-            {
-                int l1 = findLevel(o1);
-                int l2 = findLevel(o2);
-
-                if (l1 < l2)
-                {
-                    return -1;
-                }
-                else if (l1 > l2)
-                {
-                    return 1;
-                }
-                else
-                {
-                    return 0;
-                }
-            }
-
-            private int findLevel(IBundleRepository rep)
-            {
-                for (Map.Entry<Integer, HashSet<IBundleRepository>> e : levelMap.entrySet())
-                {
-                    if (e.getValue().contains(rep))
-                    {
-                        return e.getKey();
-                    }
-                }
-                throw new IllegalStateException();
-            }
-        });
-        levels = new int[levelMap.size()];
-        int i = 0;
-        for (Integer v : levelMap.keySet())
-        {
-            levels[i++] = v;
-        }
-    }
-
-    public int[] getPriorityLevels()
-    {
-        initialise();
-        synchronized (repositories)
-        {
-            return levels;
-        }
-    }
-
-    public Collection<IBundleRepository> getRepositories(int priorityLevel)
-    {
-        initialise();
-        List<IBundleRepository> found = null;
-
-        synchronized (repositories)
-        {
-            HashSet<IBundleRepository> b = levelMap.get(priorityLevel);
-            if (b == null)
-            {
-                found = Collections.emptyList();
-            }
-            else
-            {
-                found = new ArrayList<IBundleRepository>(b);
-            }
-        }
-
-        return found;
-    }
-
-    public void addLibrary(ILibrary library)
-    {
-        synchronized (libraries)
-        {
-            libraries.add(library);
-        }
-    }
-
-    public void removeLibrary(ILibrary library)
-    {
-        synchronized (libraries)
-        {
-            libraries.remove(library);
-        }
-    }
-
-    public Collection<ILibrary> getLibraries()
-    {
-        synchronized (libraries)
-        {
-            return libraries;
-        }
-    }
-
-    public ILibrary resolveLibrary(final ILibraryImport l)
-    {
-        final ArrayList<ILibrary> found = new ArrayList<ILibrary>(1);
-        //ISigilProjectModel p = l.getAncestor(ISigilProjectModel.class);
-        //
-        //IModelWalker w = new IModelWalker() {
-        //	public boolean visit(IModelElement element) {
-        //		if ( element instanceof ILibrary ) {
-        //			updateLibrary(l, (ILibrary) element, found);
-        //			return false;
-        //		}
-        //		
-        //		return true;
-        //	}
-        //};
-
-        //p.visit( w );
-
-        //if ( found.isEmpty() ) { // no project specific libraries - check workspace definitions
-        synchronized (libraries)
-        {
-            for (ILibrary lib : libraries)
-            {
-                if (l.getLibraryName().equals(lib.getName())
-                    && l.getVersions().contains(lib.getVersion()))
-                {
-                    updateLibrary(l, lib, found);
-                }
-            }
-        }
-        //}
-
-        return found.isEmpty() ? null : found.get(0);
-    }
-
-    protected void updateLibrary(ILibraryImport li, ILibrary l, ArrayList<ILibrary> found)
-    {
-        if (li.getLibraryName().equals(l.getName())
-            && li.getVersions().contains(l.getVersion()))
-        {
-            if (found.isEmpty())
-            {
-                found.add(l);
-            }
-            else
-            {
-                ILibrary c = found.get(0);
-                if (l.getVersion().compareTo(c.getVersion()) > 0)
-                {
-                    found.remove(0);
-                    found.add(l);
-                }
-            }
-        }
-    }
-
-    public IBundleResolver getBundleResolver()
-    {
-        return resolver;
-    }
-
-    public void visit(final IModelWalker walker)
-    {
-        for (IBundleRepository rep : getRepositories())
-        {
-            IRepositoryVisitor wrapper = new IRepositoryVisitor()
-            {
-                public boolean visit(ISigilBundle bundle)
-                {
-                    bundle.visit(walker);
-                    // return true as still want to visit other bundles
-                    return true;
-                }
-            };
-            rep.accept(wrapper);
-        }
-    }
-}
\ No newline at end of file
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IBundleRepository.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/IBundleRepository.java
deleted file mode 100644
index 31b0ef6..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IBundleRepository.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Collection;
-
-import org.apache.felix.sigil.common.model.eclipse.ILibrary;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-
-public interface IBundleRepository
-{
-    String getId();
-
-    void addBundleRepositoryListener(IBundleRepositoryListener listener);
-
-    void removeBundleRepositoryListener(IBundleRepositoryListener listener);
-
-    void accept(IRepositoryVisitor visitor);
-
-    void accept(IRepositoryVisitor visitor, int options);
-
-    void writeOBR(OutputStream out) throws IOException;
-
-    void refresh();
-
-    ISigilBundle findProvider(IPackageImport packageImport, int options);
-
-    ISigilBundle findProvider(IRequiredBundle bundle, int options);
-
-    Collection<ISigilBundle> findAllProviders(IRequiredBundle bundle, int options);
-
-    Collection<ISigilBundle> findAllProviders(IPackageImport packageImport, int options);
-
-    Collection<ISigilBundle> findProviders(ILibrary library, int options);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IBundleRepositoryListener.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/IBundleRepositoryListener.java
deleted file mode 100644
index b63bb5f..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IBundleRepositoryListener.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-public interface IBundleRepositoryListener
-{
-    void notifyChange(IBundleRepository repository);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IBundleResolver.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/IBundleResolver.java
deleted file mode 100644
index c60d6b5..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IBundleResolver.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-
-public interface IBundleResolver
-{
-    IResolution resolve(IModelElement element, ResolutionConfig config,
-        IResolutionMonitor monitor) throws ResolutionException;
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IProviderChangeListener.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/IProviderChangeListener.java
deleted file mode 100644
index 38e313c..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IProviderChangeListener.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-public interface IProviderChangeListener
-{
-    void notifyChange(IRepositoryProvider provider);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryChangeListener.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryChangeListener.java
deleted file mode 100644
index b70161d..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryChangeListener.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-public interface IRepositoryChangeListener
-{
-    void repositoryChanged(RepositoryChangeEvent event);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryManager.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryManager.java
deleted file mode 100644
index 5c1ec1d..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryManager.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-import java.util.Collection;
-
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.common.model.eclipse.ILibrary;
-import org.apache.felix.sigil.common.model.eclipse.ILibraryImport;
-
-public interface IRepositoryManager
-{
-    void addRepositoryChangeListener(IRepositoryChangeListener listener);
-
-    void removeRepositoryChangeListener(IRepositoryChangeListener listener);
-
-    Collection<IBundleRepository> getRepositories();
-
-    IBundleResolver getBundleResolver();
-
-    ILibrary resolveLibrary(final ILibraryImport l);
-
-    void visit(IModelWalker modelWalker);
-}
\ No newline at end of file
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryProvider.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryProvider.java
deleted file mode 100644
index dbc462e..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryProvider.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-import java.util.Properties;
-
-public interface IRepositoryProvider
-{
-    IBundleRepository createRepository(String id, Properties properties)
-        throws RepositoryException;
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryVisitor.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryVisitor.java
deleted file mode 100644
index 0f59173..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IRepositoryVisitor.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-
-public interface IRepositoryVisitor
-{
-    /**
-     * Visit the next bundle in the repository. 
-     * Return true if should continue visiting other bundles, false otherwise.
-     * @param bundle
-     * @return
-     */
-    boolean visit(ISigilBundle bundle);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IResolution.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/IResolution.java
deleted file mode 100644
index f9b053f..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IResolution.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-import java.util.List;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.progress.IProgress;
-
-public interface IResolution
-{
-    Set<ISigilBundle> getBundles();
-
-    ISigilBundle getProvider(IModelElement requirement);
-
-    List<IModelElement> getMatchedRequirements(ISigilBundle bundle);
-
-    void synchronize(IProgress progress);
-
-    boolean isSynchronized();
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IResolutionMonitor.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/IResolutionMonitor.java
deleted file mode 100644
index a866611..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/IResolutionMonitor.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-
-public interface IResolutionMonitor
-{
-    boolean isCanceled();
-
-    void startResolution(IModelElement requirement);
-
-    void endResolution(IModelElement requirement, ISigilBundle sigilBundle);
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/RepositoryChangeEvent.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/RepositoryChangeEvent.java
deleted file mode 100644
index d1be228..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/RepositoryChangeEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-public class RepositoryChangeEvent
-{
-    public static enum Type
-    {
-        ADDED, CHANGED, REMOVED
-    };
-
-    private Type type;
-    private IBundleRepository repository;
-
-    public RepositoryChangeEvent(IBundleRepository repository, Type type)
-    {
-        this.repository = repository;
-        this.type = type;
-    }
-
-    public Type getType()
-    {
-        return type;
-    }
-
-    public IBundleRepository getRepository()
-    {
-        return repository;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/RepositoryException.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/RepositoryException.java
deleted file mode 100644
index ccd39d3..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/RepositoryException.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-public class RepositoryException extends Exception
-{
-
-    private static final long serialVersionUID = 1L;
-
-    public RepositoryException(String msg, Throwable cause)
-    {
-        super(msg, cause);
-    }
-
-    public RepositoryException(String message)
-    {
-        super(message);
-    }
-
-    public RepositoryException(Throwable cause)
-    {
-        super(cause);
-    }
-
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/ResolutionConfig.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/ResolutionConfig.java
deleted file mode 100644
index 35d6c2a..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/ResolutionConfig.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-public class ResolutionConfig
-{
-    private int options;
-
-    public static final int INCLUDE_DEPENDENTS = 1;
-    public static final int INCLUDE_OPTIONAL = 2;
-    public static final int IGNORE_ERRORS = 4;
-    /** Return only bundles that are indexed locally */
-    public static final int INDEXED_ONLY = 8;
-    /** Return only bundles that are stored or cached locally */
-    public static final int LOCAL_ONLY = 16;
-    public static final int COMPILE_TIME = 32;
-
-    public ResolutionConfig()
-    {
-        this(INCLUDE_DEPENDENTS);
-    }
-
-    public ResolutionConfig(int options)
-    {
-        this.options = options;
-    }
-
-    public int getOptions()
-    {
-        return options;
-    }
-
-    public boolean isDependents()
-    {
-        return (options & INCLUDE_DEPENDENTS) != 0;
-    }
-
-    public boolean isIgnoreErrors()
-    {
-        return (options & IGNORE_ERRORS) != 0;
-    }
-
-    public boolean isOptional()
-    {
-        return (options & INCLUDE_OPTIONAL) != 0;
-    }
-
-    public boolean isCalculateLocalDependencies()
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    public boolean isCompileTime()
-    {
-        return (options & COMPILE_TIME) != 0;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/repository/ResolutionException.java b/sigil/common/core/src/org/apache/felix/sigil/common/repository/ResolutionException.java
deleted file mode 100644
index c68b9e1..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/repository/ResolutionException.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.repository;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-
-public class ResolutionException extends Exception
-{
-
-    private static final long serialVersionUID = 1L;
-
-    private IModelElement[] parsed;
-
-    public ResolutionException(String message, Throwable cause)
-    {
-        super(message, cause);
-    }
-
-    public ResolutionException(String message)
-    {
-        super(message);
-    }
-
-    public ResolutionException(Throwable cause)
-    {
-        super(cause);
-    }
-
-    public ResolutionException(IModelElement root, IModelElement[] parsed)
-    {
-        super(buildMessage(root, parsed));
-        this.parsed = parsed;
-    }
-
-    private static String buildMessage(IModelElement root, IModelElement[] parsed)
-    {
-        StringBuilder b = new StringBuilder();
-        b.append("Failed to resolve ");
-        b.append(root);
-
-        if (parsed.length > 0)
-        {
-            b.append(" due to missing provider for ");
-            b.append(parsed[parsed.length - 1]);
-        }
-
-        return b.toString();
-    }
-
-    public IModelElement[] getParsed()
-    {
-        return parsed;
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/util/ManifestUtil.java b/sigil/common/core/src/org/apache/felix/sigil/common/util/ManifestUtil.java
deleted file mode 100644
index 9048a77..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/util/ManifestUtil.java
+++ /dev/null
@@ -1,265 +0,0 @@
-package org.apache.felix.sigil.common.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.jar.Attributes;
-import java.util.jar.Manifest;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.ModelElementFactoryException;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.osgi.framework.Version;
-
-public class ManifestUtil
-{
-    /**
-     * Use this utility to read Manifest from a JarFile or ZipFile
-     * due to http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6735255
-     * 
-     * @param zip
-     * @return
-     * @throws IOException
-     */
-    public static Manifest getManifest(ZipFile zip) throws IOException {
-        ZipEntry entry = zip.getEntry("META-INF/MANIFEST.MF");
-        if ( entry == null ) return null;
-        
-        InputStream in = zip.getInputStream(entry);
-        try {
-            return new Manifest(in);
-        }
-        finally {
-            // explicitly close due to 
-            // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6735255
-            in.close();
-        }
-    }
-    
-    public static IBundleModelElement buildBundleModelElement(ZipFile zip) throws IOException {
-        IBundleModelElement info = null;
-
-        Manifest mf = getManifest(zip);
-        
-        if (mf != null)
-        {
-            Attributes attrs = mf.getMainAttributes();
-            String name = attrs.getValue("Bundle-SymbolicName");
-            if (name == null)
-            {
-                // framework.jar doesn't have Bundle-SymbolicName!
-                name = attrs.getValue("Bundle-Name");
-            }
-
-            if (name != null)
-            {
-                try
-                {
-                    info = ModelElementFactory.getInstance().newModelElement(
-                        IBundleModelElement.class);
-                    info.setSymbolicName(name.split(";")[0]);
-                    info.setVersion(VersionTable.getVersion(attrs.getValue("Bundle-Version")));
-                    info.setName(attrs.getValue("Bundle-Name"));
-                    info.setDescription(attrs.getValue("Bundle-Description"));
-                    info.setVendor(attrs.getValue("Bundle-Vendor"));
-
-                    String str = attrs.getValue("Import-Package");
-                    if (str != null)
-                    {
-                        addImports(info, str);
-                    }
-
-                    str = attrs.getValue("Export-Package");
-                    if (str != null)
-                    {
-                        addExports(info, str);
-                    }
-
-                    str = attrs.getValue("Require-Bundle");
-                    if (str != null)
-                    {
-                        addRequires(info, str);
-                    }
-
-                    str = attrs.getValue("Bundle-Classpath");
-
-                    if (str != null)
-                    {
-                        addClasspath(info, str);
-                    }
-
-                    str = attrs.getValue("Fragment-Host");
-                    if (str != null)
-                    {
-                        addHost(info, str);
-                    }
-                }
-                catch (RuntimeException e)
-                {
-                    BldCore.error("Failed to read info from bundle " + name, e);
-                    // clear elements as clearly got garbage
-                    info = null;
-                }
-            }
-        }
-
-        return info;
-    }
-
-    private static void addClasspath(IBundleModelElement info, String cpStr)
-    {
-        for (String cp : cpStr.split("\\s*,\\s*"))
-        {
-            info.addClasspath(cp);
-        }
-    }
-
-    private static void addExports(IBundleModelElement info, String exportStr)
-        throws ModelElementFactoryException
-    {
-        for (String exp : QuoteUtil.split(exportStr))
-        {
-            try
-            {
-                String[] parts = exp.split(";");
-                IPackageExport pe = ModelElementFactory.getInstance().newModelElement(
-                    IPackageExport.class);
-                pe.setPackageName(parts[0].trim());
-
-                if (parts.length > 1)
-                {
-                    for (int i = 1; i < parts.length; i++)
-                    {
-                        String check = parts[i];
-                        if (check.toLowerCase().startsWith("version="))
-                        {
-                            pe.setVersion(parseVersion(check.substring("version=".length())));
-                        }
-                        else if (check.toLowerCase().startsWith("specification-version="))
-                        {
-                            pe.setVersion(parseVersion(check.substring("specification-version=".length())));
-                        }
-                        else if (check.toLowerCase().startsWith("uses:="))
-                        {
-                            for (String use : parseUses(check.substring("uses:=".length())))
-                            {
-                                pe.addUse(use);
-                            }
-                        }
-                    }
-                }
-                info.addExport(pe);
-            }
-            catch (RuntimeException e)
-            {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    private static Collection<String> parseUses(String uses)
-    {
-        if (uses.startsWith("\""))
-        {
-            uses = uses.substring(1, uses.length() - 2);
-        }
-
-        return Arrays.asList(uses.split(","));
-    }
-
-    private static Version parseVersion(String val)
-    {
-        val = val.replaceAll("\"", "");
-        return VersionTable.getVersion(val);
-    }
-
-    private static void addImports(IBundleModelElement info, String importStr)
-        throws ModelElementFactoryException
-    {
-        for (String imp : QuoteUtil.split(importStr))
-        {
-            String[] parts = imp.split(";");
-            IPackageImport pi = ModelElementFactory.getInstance().newModelElement(
-                IPackageImport.class);
-            pi.setPackageName(parts[0].trim());
-
-            if (parts.length > 1)
-            {
-                for (int i = 1; i < parts.length; i++)
-                {
-                    String p = parts[i];
-                    if (p.toLowerCase().startsWith("version="))
-                    {
-                        pi.setVersions(VersionRange.parseVersionRange(p.substring("version=".length())));
-                    }
-                    else if (p.toLowerCase().startsWith("specification-version="))
-                    {
-                        pi.setVersions(VersionRange.parseVersionRange(p.substring("specification-version=".length())));
-                    }
-                    else if (p.toLowerCase().startsWith("resolution:="))
-                    {
-                        pi.setOptional(p.toLowerCase().substring("resolution:=".length()).equals(
-                            "optional"));
-                    }
-                }
-            }
-            info.addImport(pi);
-        }
-    }
-
-    private static void addRequires(IBundleModelElement info, String reqStr)
-        throws ModelElementFactoryException
-    {
-        for (String imp : QuoteUtil.split(reqStr))
-        {
-            String[] parts = imp.split(";");
-            IRequiredBundle req = ModelElementFactory.getInstance().newModelElement(
-                IRequiredBundle.class);
-            req.setSymbolicName(parts[0]);
-
-            if (parts.length > 1)
-            {
-                if (parts[1].toLowerCase().startsWith("version="))
-                {
-                    req.setVersions(VersionRange.parseVersionRange(parts[1].substring("version=".length())));
-                }
-                else if (parts[1].toLowerCase().startsWith("specification-version="))
-                {
-                    req.setVersions(VersionRange.parseVersionRange(parts[1].substring("specification-version=".length())));
-                }
-            }
-            info.addRequiredBundle(req);
-        }
-    }
-
-    /**
-     * @param info
-     * @param str
-     */
-    private static void addHost(IBundleModelElement info, String str)
-    {
-        String[] parts = str.split(";");
-        IRequiredBundle req = ModelElementFactory.getInstance().newModelElement(
-            IRequiredBundle.class);
-        req.setSymbolicName(parts[0].trim());
-
-        if (parts.length > 1)
-        {
-            String part = parts[1].toLowerCase().trim();
-            if (part.startsWith("bundle-version="))
-            {
-                req.setVersions(VersionRange.parseVersionRange(part.substring("bundle-version=".length())));
-            }
-        }
-        info.setFragmentHost(req);
-    }
-}
diff --git a/sigil/common/core/src/org/apache/felix/sigil/common/util/QuoteUtil.java b/sigil/common/core/src/org/apache/felix/sigil/common/util/QuoteUtil.java
deleted file mode 100644
index 4bab43e..0000000
--- a/sigil/common/core/src/org/apache/felix/sigil/common/util/QuoteUtil.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.util;
-
-import java.util.ArrayList;
-
-public class QuoteUtil
-{
-    public static String[] split(String str)
-    {
-        ArrayList<String> split = new ArrayList<String>();
-        boolean quote = false;
-        StringBuffer buf = new StringBuffer(str.length());
-
-        for (int i = 0; i < str.length(); i++)
-        {
-            char c = str.charAt(i);
-            switch (c)
-            {
-                case '"':
-                    quote = !quote;
-                    break;
-                case ',':
-                    if (!quote)
-                    {
-                        split.add(buf.toString().trim());
-                        buf.setLength(0);
-                        break;
-                    }
-                    // else fall through on purpose
-                default:
-                    buf.append(c);
-            }
-        }
-
-        if (buf.length() > 0)
-        {
-            split.add(buf.toString().trim());
-        }
-        return split.toArray(new String[split.size()]);
-    }
-}
diff --git a/sigil/common/junit/.classpath b/sigil/common/junit/.classpath
deleted file mode 100644
index c9ffd60..0000000
--- a/sigil/common/junit/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/common/junit/.project b/sigil/common/junit/.project
deleted file mode 100644
index aebb4f6..0000000
--- a/sigil/common/junit/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.common.junit</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/common/junit/.settings/org.eclipse.jdt.core.prefs b/sigil/common/junit/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9b955ca..0000000
--- a/sigil/common/junit/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,263 +0,0 @@
-#Thu Sep 17 16:07:16 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/common/junit/.settings/org.eclipse.jdt.ui.prefs b/sigil/common/junit/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 6fc2d89..0000000
--- a/sigil/common/junit/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:07:16 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/common/junit/build.xml b/sigil/common/junit/build.xml
deleted file mode 100644
index 712ef92..0000000
--- a/sigil/common/junit/build.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-
-<project name="junit" default="bundle" basedir=".">
-  <import file="../build.xml"/>
-</project>
diff --git a/sigil/common/junit/ivy.xml b/sigil/common/junit/ivy.xml
deleted file mode 100644
index 6121212..0000000
--- a/sigil/common/junit/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache"
-        module="felix.sigil.common.junit"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.common.junit" />
-   </publications>
-</ivy-module>
diff --git a/sigil/common/junit/sigil.properties b/sigil/common/junit/sigil.properties
deleted file mode 100644
index c39b192..0000000
--- a/sigil/common/junit/sigil.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--activator: org.apache.felix.sigil.common.junit.activator.Activator
-
--bundles: \
-	org.apache.felix.sigil.common.junit, \
-
--sourcedirs: \
-	src, \
-
--exports: \
-	org.apache.felix.sigil.common.junit.server, \
-
--imports: \
-	junit.framework, \
-	org.apache.felix.sigil.common.junit.server, \
-	org.osgi.framework, \
-	org.osgi.util.tracker, \
-
-# end
diff --git a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/AbstractSigilTestCase.java b/sigil/common/junit/src/org/apache/felix/sigil/common/junit/AbstractSigilTestCase.java
deleted file mode 100644
index 93453a0..0000000
--- a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/AbstractSigilTestCase.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.junit;
-
-import java.lang.reflect.Method;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
-
-import junit.framework.TestCase;
-
-public abstract class AbstractSigilTestCase extends TestCase
-{
-
-    private final static List<ServiceTracker> trackers = new LinkedList<ServiceTracker>();
-
-    private BundleContext ctx;
-
-    public void setBundleContext(BundleContext ctx)
-    {
-        this.ctx = ctx;
-    }
-
-    protected BundleContext getBundleContext()
-    {
-        return ctx;
-    }
-
-    @Override
-    protected void setUp()
-    {
-        for (Class<?> c : getReferences())
-        {
-            ServiceTracker t = createBindTracker(c);
-            t.open();
-            trackers.add(t);
-        }
-    }
-
-    @Override
-    protected void tearDown()
-    {
-        for (ServiceTracker t : trackers)
-        {
-            t.close();
-        }
-        trackers.clear();
-    }
-
-    private ServiceTracker createBindTracker(final Class<?> c)
-    {
-        return new ServiceTracker(ctx, c.getName(), new ServiceTrackerCustomizer()
-        {
-            public Object addingService(ServiceReference reference)
-            {
-                Object o = ctx.getService(reference);
-                Method m = getBindMethod(c);
-                if (m != null)
-                    invoke(m, o);
-                return o;
-            }
-
-            public void modifiedService(ServiceReference reference, Object service)
-            {
-            }
-
-            public void removedService(ServiceReference reference, Object service)
-            {
-                Method m = getUnbindMethod(c);
-                if (m != null)
-                    invoke(m, service);
-                ctx.ungetService(reference);
-            }
-        });
-    }
-
-    private void invoke(Method m, Object o)
-    {
-        try
-        {
-            m.invoke(this, new Object[] { o });
-        }
-        catch (Exception e)
-        {
-            throw new IllegalStateException("Failed to invoke binding method " + m, e);
-        }
-    }
-
-    protected abstract Class<?>[] getReferences();
-
-    protected abstract Method getBindMethod(Class<?> clazz);
-
-    protected abstract Method getUnbindMethod(Class<?> clazz);
-}
diff --git a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/ReflectiveSigilTestCase.java b/sigil/common/junit/src/org/apache/felix/sigil/common/junit/ReflectiveSigilTestCase.java
deleted file mode 100644
index 96743c3..0000000
--- a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/ReflectiveSigilTestCase.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.junit;
-
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-
-public abstract class ReflectiveSigilTestCase extends AbstractSigilTestCase
-{
-
-    private Class<?>[] references;
-    private Map<Class<?>, Method> bindMethods;
-    private Map<Class<?>, Method> unbindMethods;
-
-    @Override
-    protected Class<?>[] getReferences()
-    {
-        introspect();
-        return references;
-    }
-
-    @Override
-    protected Method getBindMethod(Class<?> clazz)
-    {
-        return bindMethods.get(clazz);
-    }
-
-    @Override
-    protected Method getUnbindMethod(Class<?> clazz)
-    {
-        return unbindMethods.get(clazz);
-    }
-
-    private void introspect()
-    {
-        if (references == null)
-        {
-            bindMethods = findBindMethods(getClass(), "set", "add");
-            unbindMethods = findBindMethods(getClass(), "set", "remove");
-
-            HashSet<Class<?>> refs = new HashSet<Class<?>>();
-            refs.addAll(bindMethods.keySet());
-            refs.addAll(unbindMethods.keySet());
-            references = refs.toArray(new Class<?>[refs.size()]);
-        }
-    }
-
-    private static Map<Class<?>, Method> findBindMethods(Class<?> clazz, String... prefix)
-    {
-        HashMap<Class<?>, Method> found = new HashMap<Class<?>, Method>();
-
-        checkDeclaredMethods(clazz, found, prefix);
-
-        return found;
-    }
-
-    private static void checkDeclaredMethods(Class<?> clazz, Map<Class<?>, Method> found,
-        String... prefix)
-    {
-        for (Method m : clazz.getDeclaredMethods())
-        {
-            if (isMethodPrefixed(m, prefix) && isBindSignature(m))
-            {
-                found.put(m.getParameterTypes()[0], m);
-            }
-        }
-
-        Class<?> sup = clazz.getSuperclass();
-        if (sup != null && sup != Object.class)
-        {
-            checkDeclaredMethods(sup, found, prefix);
-        }
-
-        for (Class<?> i : clazz.getInterfaces())
-        {
-            checkDeclaredMethods(i, found, prefix);
-        }
-    }
-
-    private static boolean isMethodPrefixed(Method m, String... prefix)
-    {
-        String n = m.getName();
-        for (String p : prefix)
-        {
-            if (n.startsWith(p) && n.length() > p.length())
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private static boolean isBindSignature(Method m)
-    {
-        return m.getReturnType() == Void.TYPE && m.getParameterTypes().length == 1;
-    }
-}
diff --git a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/activator/Activator.java b/sigil/common/junit/src/org/apache/felix/sigil/common/junit/activator/Activator.java
deleted file mode 100644
index a34511c..0000000
--- a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/activator/Activator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.junit.activator;
-
-import org.apache.felix.sigil.common.junit.server.JUnitService;
-import org.apache.felix.sigil.common.junit.server.impl.JUnitServiceFactory;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-
-/**
- * @author dave
- */
-public class Activator implements BundleActivator
-{
-    private ServiceRegistration reg;
-    private JUnitServiceFactory service;
-
-    public void start(final BundleContext ctx)
-    {
-        service = new JUnitServiceFactory();
-        service.start(ctx);
-        reg = ctx.registerService(JUnitService.class.getName(), service, null);
-    }
-
-    public void stop(BundleContext ctx)
-    {
-        reg.unregister();
-        reg = null;
-        service.stop(ctx);
-        service = null;
-    }
-}
diff --git a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/JUnitService.java b/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/JUnitService.java
deleted file mode 100644
index 0d73a50..0000000
--- a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/JUnitService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.junit.server;
-
-import java.util.Set;
-
-import org.osgi.framework.BundleContext;
-
-import junit.framework.TestSuite;
-
-public interface JUnitService
-{
-    Set<String> getTests();
-
-    TestSuite createTest(String test);
-
-    TestSuite createTest(String test, BundleContext ctx);
-}
\ No newline at end of file
diff --git a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/impl/JUnitServiceFactory.java b/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/impl/JUnitServiceFactory.java
deleted file mode 100644
index 838d30a..0000000
--- a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/impl/JUnitServiceFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.junit.server.impl;
-
-import java.util.HashMap;
-import java.util.Set;
-import java.util.TreeSet;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceFactory;
-import org.osgi.framework.ServiceRegistration;
-
-public class JUnitServiceFactory implements ServiceFactory
-{
-
-    private HashMap<String, Class<? extends TestCase>> tests = new HashMap<String, Class<? extends TestCase>>();
-    private TestClassListener listener;
-
-    public void start(BundleContext ctx)
-    {
-        listener = new TestClassListener(this);
-        ctx.addBundleListener(listener);
-        //listener.index(ctx.getBundle());
-        for (Bundle b : ctx.getBundles())
-        {
-            if (b.getState() == Bundle.RESOLVED)
-            {
-                listener.index(b);
-            }
-        }
-    }
-
-    public void stop(BundleContext ctx)
-    {
-        ctx.removeBundleListener(listener);
-        listener = null;
-    }
-
-    public Object getService(Bundle bundle, ServiceRegistration reg)
-    {
-        return new JUnitServiceImpl(this, bundle.getBundleContext());
-    }
-
-    public void ungetService(Bundle bundle, ServiceRegistration reg, Object service)
-    {
-    }
-
-    public void registerTest(Class<? extends TestCase> clazz)
-    {
-        tests.put(clazz.getName(), clazz);
-    }
-
-    public void unregister(Class<? extends TestCase> clazz)
-    {
-        tests.remove(clazz.getName());
-    }
-
-    public Set<String> getTests()
-    {
-        return new TreeSet<String>(tests.keySet());
-    }
-
-    public TestSuite getTest(String test)
-    {
-        Class<? extends TestCase> tc = tests.get(test);
-        return tc == null ? null : new TestSuite(tc);
-    }
-
-}
diff --git a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/impl/JUnitServiceImpl.java b/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/impl/JUnitServiceImpl.java
deleted file mode 100644
index 593d280..0000000
--- a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/impl/JUnitServiceImpl.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.junit.server.impl;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.apache.felix.sigil.common.junit.server.JUnitService;
-import org.osgi.framework.BundleContext;
-
-public class JUnitServiceImpl implements JUnitService
-{
-
-    private static final Logger log = Logger.getLogger(JUnitServiceImpl.class.getName());
-
-    private static final Class<?>[] BUNDLE_CONTEXT_PARAMS = new Class[] { BundleContext.class };
-
-    private final JUnitServiceFactory junitServiceFactory;
-    private final BundleContext bundleContext;
-
-    public JUnitServiceImpl(JUnitServiceFactory junitServiceFactory, BundleContext bundleContext)
-    {
-        this.junitServiceFactory = junitServiceFactory;
-        this.bundleContext = bundleContext;
-    }
-
-    public Set<String> getTests()
-    {
-        return junitServiceFactory.getTests();
-    }
-
-    public TestSuite createTest(String test)
-    {
-        return createTest(test, null);
-    }
-
-    public TestSuite createTest(String test, BundleContext ctx)
-    {
-        try
-        {
-            TestSuite ts = junitServiceFactory.getTest(test);
-
-            if (ts == null)
-                return null;
-
-            TestSuite ret = new TestSuite(ts.getName());
-
-            Enumeration<Test> e = ts.tests();
-
-            while (e.hasMoreElements())
-            {
-                Test t = e.nextElement();
-                setContext(t, ctx);
-                ret.addTest(t);
-            }
-
-            return ret;
-        }
-        catch (final NoClassDefFoundError e)
-        {
-            TestSuite s = new TestSuite(test);
-            s.addTest(new Test()
-            {
-                public int countTestCases()
-                {
-                    return 1;
-                }
-
-                public void run(TestResult result)
-                {
-                    result.addError(this, e);
-                }
-            });
-            return s;
-        }
-        catch (final RuntimeException e)
-        {
-            TestSuite s = new TestSuite(test);
-            s.addTest(new Test()
-            {
-                public int countTestCases()
-                {
-                    return 1;
-                }
-
-                public void run(TestResult result)
-                {
-                    result.addError(this, e);
-                }
-
-            });
-            return s;
-        }
-    }
-
-    private void setContext(Test t, BundleContext ctx)
-    {
-        try
-        {
-            Method m = findMethod(t.getClass(), "setBundleContext", BUNDLE_CONTEXT_PARAMS);
-            if (m != null)
-                m.invoke(t, ctx == null ? bundleContext : ctx);
-        }
-        catch (SecurityException e)
-        {
-            log.log(Level.WARNING, "Failed to set bundle context on " + t, e);
-        }
-        catch (IllegalArgumentException e)
-        {
-            log.log(Level.WARNING, "Failed to set bundle context on " + t, e);
-        }
-        catch (IllegalAccessException e)
-        {
-            log.log(Level.WARNING, "Failed to set bundle context on " + t, e);
-        }
-        catch (InvocationTargetException e)
-        {
-            log.log(Level.WARNING, "Failed to set bundle context on " + t, e);
-        }
-    }
-
-    private Method findMethod(Class<?> clazz, String name, Class<?>[] params)
-    {
-        Method found = null;
-
-        for (Method m : clazz.getDeclaredMethods())
-        {
-            if (m.getName().equals(name)
-                && Arrays.deepEquals(m.getParameterTypes(), params))
-            {
-                found = m;
-                break;
-            }
-        }
-
-        if (found == null)
-        {
-            Class<?> c = clazz.getSuperclass();
-
-            if (c != null && c != Object.class)
-            {
-                found = findMethod(c, name, params);
-            }
-        }
-
-        if (found == null)
-        {
-            for (Class<?> c : clazz.getInterfaces())
-            {
-                found = findMethod(c, name, params);
-                if (found != null)
-                {
-                    break;
-                }
-            }
-        }
-
-        return found;
-    }
-}
diff --git a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/impl/TestClassListener.java b/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/impl/TestClassListener.java
deleted file mode 100644
index 3c7b22b..0000000
--- a/sigil/common/junit/src/org/apache/felix/sigil/common/junit/server/impl/TestClassListener.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.junit.server.impl;
-
-import java.lang.reflect.Modifier;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import junit.framework.TestCase;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.SynchronousBundleListener;
-
-public class TestClassListener implements SynchronousBundleListener
-{
-    private static final Logger log = Logger.getLogger(TestClassListener.class.getName());
-
-    private final JUnitServiceFactory service;
-
-    private HashMap<Long, Class<TestCase>[]> registrations = new HashMap<Long, Class<TestCase>[]>();
-
-    public TestClassListener(JUnitServiceFactory service)
-    {
-        this.service = service;
-    }
-
-    public void bundleChanged(BundleEvent event)
-    {
-        switch (event.getType())
-        {
-            case BundleEvent.RESOLVED:
-                index(event.getBundle());
-                break;
-            case BundleEvent.UNRESOLVED:
-                unindex(event.getBundle());
-                break;
-        }
-    }
-
-    void index(Bundle bundle)
-    {
-        if (isTestBundle(bundle))
-        {
-            List<String> tests = findTests(bundle);
-
-            if (!tests.isEmpty())
-            {
-                LinkedList<Class<? extends TestCase>> regs = new LinkedList<Class<? extends TestCase>>();
-
-                for (String jc : tests)
-                {
-                    try
-                    {
-                        Class<?> clazz = bundle.loadClass(jc);
-                        if (isTestCase(clazz))
-                        {
-                            Class<? extends TestCase> tc = clazz.asSubclass(TestCase.class);
-                            regs.add(tc);
-                            service.registerTest(tc);
-                        }
-                    }
-                    catch (ClassNotFoundException e)
-                    {
-                        log.log(Level.WARNING, "Failed to load class " + jc, e);
-                    }
-                    catch (NoClassDefFoundError e)
-                    {
-                        log.log(Level.WARNING, "Failed to load class " + jc, e);
-                    }
-                }
-
-                registrations.put(bundle.getBundleId(), toArray(regs));
-            }
-        }
-    }
-
-    private boolean isTestBundle(Bundle bundle)
-    {
-        try
-        {
-            bundle.loadClass(TestCase.class.getName());
-            return true;
-        }
-        catch (ClassNotFoundException e)
-        {
-            return false;
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private Class<TestCase>[] toArray(LinkedList<Class<? extends TestCase>> regs)
-    {
-        return regs.toArray(new Class[regs.size()]);
-    }
-
-    private boolean isTestCase(Class<?> clazz)
-    {
-        return TestCase.class.isAssignableFrom(clazz)
-            && !Modifier.isAbstract(clazz.getModifiers())
-            && !clazz.getPackage().getName().startsWith("junit");
-    }
-
-    void unindex(Bundle bundle)
-    {
-        Class<TestCase>[] classes = registrations.remove(bundle.getBundleId());
-        if (classes != null)
-        {
-            for (Class<TestCase> tc : classes)
-            {
-                service.unregister(tc);
-            }
-        }
-    }
-
-    private List<String> findTests(Bundle bundle)
-    {
-        @SuppressWarnings("unchecked")
-        Enumeration<URL> urls = bundle.findEntries("", "*.class", true);
-
-        LinkedList<String> tests = new LinkedList<String>();
-        while (urls.hasMoreElements())
-        {
-            URL url = urls.nextElement();
-            tests.add(toClassName(url));
-        }
-
-        return tests;
-    }
-
-    private String toClassName(URL url)
-    {
-        String f = url.getFile();
-        String cn = f.substring(1, f.length() - 6);
-        return cn.replace('/', '.');
-    }
-
-}
diff --git a/sigil/common/obr.test/.classpath b/sigil/common/obr.test/.classpath
deleted file mode 100644
index c9ffd60..0000000
--- a/sigil/common/obr.test/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/common/obr.test/.project b/sigil/common/obr.test/.project
deleted file mode 100644
index f952bce..0000000
--- a/sigil/common/obr.test/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.common.obr.test</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/common/obr.test/sigil.properties b/sigil/common/obr.test/sigil.properties
deleted file mode 100644
index 2945c8f..0000000
--- a/sigil/common/obr.test/sigil.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--bundles: \
-	org.apache.felix.sigil.common.obr.test, \
-
--sourcedirs: \
-	src, \
-
--fragment: \
-	org.apache.felix.sigil.common.obr;version=0.9.0, \
-
--imports: \
-	junit.framework, \
-	org.osgi.framework, \
-	org.apache.felix.sigil.common.osgi;version=0.9.0, \
-
-# end
diff --git a/sigil/common/obr.test/src/org/apache/felix/sigil/obr/impl/VersionRangeHelperTest.java b/sigil/common/obr.test/src/org/apache/felix/sigil/obr/impl/VersionRangeHelperTest.java
deleted file mode 100644
index 75a7513..0000000
--- a/sigil/common/obr.test/src/org/apache/felix/sigil/obr/impl/VersionRangeHelperTest.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.obr.impl;
-
-import org.apache.felix.sigil.common.obr.impl.VersionRangeHelper;
-import org.apache.felix.sigil.common.osgi.LDAPExpr;
-import org.apache.felix.sigil.common.osgi.LDAPParser;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.osgi.framework.Version;
-
-import junit.framework.TestCase;
-
-public class VersionRangeHelperTest extends TestCase
-{
-    public void testRange1()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(&(version>=1.0.0)(version<=2.0.0))");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(VersionRange.parseVersionRange("[1.0.0,2.0.0]"), range);
-    }
-
-    public void testRange2()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(&(version>1.0.0)(version<2.0.0))");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(VersionRange.parseVersionRange("(1.0.0,2.0.0)"), range);
-    }
-
-    public void testRange3()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(&(!(version<1.0.0))(!(version>2.0.0)))");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(VersionRange.parseVersionRange("[1.0.0,2.0.0]"), range);
-    }
-
-    public void testRange4()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(&(!(version<=1.0.0))(!(version>=2.0.0)))");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(VersionRange.parseVersionRange("(1.0.0,2.0.0)"), range);
-    }
-
-    public void testRange5()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(version=1.0.0)");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(VersionRange.parseVersionRange("[1.0.0,1.0.0]"), range);
-    }
-
-    public void testRange6()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(version>=1.0.0)");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(new VersionRange(false, new Version(1, 0, 0),
-            VersionRange.INFINITE_VERSION, true), range);
-    }
-
-    public void testRange7()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(version<=2.0.0)");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(VersionRange.parseVersionRange("[0,2.0.0]"), range);
-    }
-
-    public void testRange8()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(version>1.0.0)");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(new VersionRange(true, new Version(1, 0, 0),
-            VersionRange.INFINITE_VERSION, true), range);
-    }
-
-    public void testRange9()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(version<2.0.0)");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(VersionRange.parseVersionRange("[0,2.0.0)"), range);
-    }
-
-    public void testRange10()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(!(version>2.0.0))");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(VersionRange.parseVersionRange("[0,2.0.0]"), range);
-    }
-
-    public void testRange11()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(!(version<1.0.0))");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(VersionRange.parseVersionRange("1.0.0"), range);
-    }
-
-    public void testRange12()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(!(version>=2.0.0))");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(VersionRange.parseVersionRange("[0,2.0.0)"), range);
-    }
-
-    public void testRange13()
-    {
-        LDAPExpr expr;
-        VersionRange range;
-
-        expr = LDAPParser.parseExpression("(!(version<=1.0.0))");
-        range = VersionRangeHelper.decodeVersions(expr);
-        assertEquals(new VersionRange(true, new Version(1, 0, 0),
-            VersionRange.INFINITE_VERSION, true), range);
-    }
-}
diff --git a/sigil/common/obr/.classpath b/sigil/common/obr/.classpath
deleted file mode 100644
index 427e30f..0000000
--- a/sigil/common/obr/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/common/obr/.project b/sigil/common/obr/.project
deleted file mode 100644
index 2576901..0000000
--- a/sigil/common/obr/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.common.obr</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/common/obr/.settings/org.eclipse.jdt.core.prefs b/sigil/common/obr/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 5a9f21b..0000000
--- a/sigil/common/obr/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,263 +0,0 @@
-#Thu Sep 17 16:07:48 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/common/obr/.settings/org.eclipse.jdt.ui.prefs b/sigil/common/obr/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 0f83f19..0000000
--- a/sigil/common/obr/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:07:48 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/common/obr/.settings/org.eclipse.pde.core.prefs b/sigil/common/obr/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index 66d1746..0000000
--- a/sigil/common/obr/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Wed Sep 10 14:14:56 BST 2008
-eclipse.preferences.version=1
-pluginProject.equinox=false
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/sigil/common/obr/DEPENDENCIES b/sigil/common/obr/DEPENDENCIES
deleted file mode 100644
index e9ecd0b..0000000
--- a/sigil/common/obr/DEPENDENCIES
+++ /dev/null
@@ -1,20 +0,0 @@
-Apache Felix Sigil Common OBR
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
diff --git a/sigil/common/obr/NOTICE b/sigil/common/obr/NOTICE
deleted file mode 100644
index caf3ce7..0000000
--- a/sigil/common/obr/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Common Core
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/common/obr/build.xml b/sigil/common/obr/build.xml
deleted file mode 100644
index 39cb53f..0000000
--- a/sigil/common/obr/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="common.obr" default="build">
-      <import file="../build.xml"/>
-</project>
diff --git a/sigil/common/obr/ivy.xml b/sigil/common/obr/ivy.xml
deleted file mode 100644
index 374a9cf..0000000
--- a/sigil/common/obr/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache"
-        module="felix.sigil.common.obr"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.common.obr" />
-   </publications>
-</ivy-module>
diff --git a/sigil/common/obr/sigil.properties b/sigil/common/obr/sigil.properties
deleted file mode 100644
index 001899d..0000000
--- a/sigil/common/obr/sigil.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--bundles: \
-	org.apache.felix.sigil.common.obr, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-
--sourcedirs: \
-	src, \
-
--exports: \
-	org.apache.felix.sigil.common.obr, \
-
--imports: \
-	org.apache.felix.sigil.common.model, \
-	org.apache.felix.sigil.common.model.eclipse, \
-	org.apache.felix.sigil.common.model.osgi, \
-	org.apache.felix.sigil.common.obr, \
-	org.apache.felix.sigil.common.osgi, \
-	org.apache.felix.sigil.common.repository, \
-	org.osgi.framework, \
-
-# end
diff --git a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/OBRRepositoryProvider.java b/sigil/common/obr/src/org/apache/felix/sigil/common/obr/OBRRepositoryProvider.java
deleted file mode 100644
index 524fc8b..0000000
--- a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/OBRRepositoryProvider.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.obr;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Properties;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.felix.sigil.common.obr.impl.CachingOBRBundleRepository;
-import org.apache.felix.sigil.common.obr.impl.NonCachingOBRBundleRepository;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-import org.apache.felix.sigil.common.repository.RepositoryException;
-
-public class OBRRepositoryProvider implements IRepositoryProvider
-{
-    private static final String IN_MEMORY = "inmemory";
-    private static final String UPDATE_PERIOD = "updatePeriod";
-    private static final String AUTH_FILE = "auth";
-    public static final String CACHE_DIRECTORY = "cache";
-    public static final String INDEX_CACHE_FILE = "index";
-    public static final String OFFLINE = "offline";
-
-    public IBundleRepository createRepository(String id, Properties preferences)
-        throws RepositoryException
-    {
-        String urlStr = preferences.getProperty("url");
-        if (urlStr == null)
-            throw new RepositoryException("url is not specified.");
-
-        try
-        {
-            File urlFile = new File(urlStr);
-            URL repositoryURL = urlFile.exists() ? urlFile.toURI().toURL() : new URL(
-                urlStr);
-            URL testURL = urlFile.exists() ? urlFile.toURI().toURL() : new URL(urlStr);
-            File indexCache = new File(preferences.getProperty(INDEX_CACHE_FILE));
-            File localCache = new File(preferences.getProperty(CACHE_DIRECTORY));
-            String auth = preferences.getProperty(AUTH_FILE);
-            File authFile = auth == null ? null : new File(auth);
-            Long up = preferences.containsKey(UPDATE_PERIOD) ? Long.parseLong(preferences.getProperty(UPDATE_PERIOD))
-                : 60 * 60 * 24 * 7;
-            
-            boolean offline = preferences.containsKey(OFFLINE) ? Boolean.parseBoolean(preferences.getProperty(OFFLINE)) : false;
-
-            if (!offline && testURL.openConnection().getLastModified() == 0)
-            {
-                String msg = "Failed to read OBR index: ";
-                if (!indexCache.exists())
-                    throw new RepositoryException(msg + urlStr);
-                System.err.println("WARNING: " + msg + "using cache: " + urlStr);
-            }
-
-            long updatePeriod = TimeUnit.MILLISECONDS.convert(up, TimeUnit.SECONDS);
-            if (preferences.getProperty(IN_MEMORY) == null)
-            {
-                return new NonCachingOBRBundleRepository(id, repositoryURL, indexCache,
-                    localCache, updatePeriod, authFile, offline);
-            }
-            else
-            {
-                return new CachingOBRBundleRepository(id, repositoryURL, indexCache,
-                    localCache, updatePeriod, authFile, offline);
-            }
-        }
-        catch (IOException e)
-        {
-            throw new RepositoryException(id + ": invalid repository url:" + urlStr, e);
-        }
-    }
-}
diff --git a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/AbstractOBRBundleRepository.java b/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/AbstractOBRBundleRepository.java
deleted file mode 100644
index b8599e2..0000000
--- a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/AbstractOBRBundleRepository.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.obr.impl;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Properties;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.apache.felix.sigil.common.repository.AbstractBundleRepository;
-import org.xml.sax.SAXException;
-
-public abstract class AbstractOBRBundleRepository extends AbstractBundleRepository
-{
-    private static SAXParserFactory factory = SAXParserFactory.newInstance();
-
-    private final URL obrURL;
-    private final File obrlCache;
-    private final File bundleCache;
-    private final long updatePeriod;
-    private final File authFile;
-    private final Properties authMap = new Properties();
-    private final boolean offline;
-
-    private long authLastModified;
-    
-    public AbstractOBRBundleRepository(String id, URL repositoryURL, File obrCache, File bundleCache, long updatePeriod, File authFile, boolean offline)
-    {
-        super(id);
-        this.obrURL = repositoryURL;
-        this.obrlCache = (repositoryURL.getProtocol().equals("file") ? null : obrCache);
-        this.bundleCache = bundleCache;
-        this.updatePeriod = updatePeriod;
-        this.authFile = authFile;
-        this.offline = offline;
-    }
-
-    public void refresh()
-    {
-        if (obrlCache != null)
-            obrlCache.delete();
-    }
-
-    protected void readBundles(OBRListener listener)
-    {
-        File index = syncOBRIndex();
-        OBRHandler handler = new OBRHandler(getObrURL(), getBundleCache(), listener);
-        try
-        {
-            SAXParser parser = factory.newSAXParser();
-            if (getObrlCache() != null)
-                parser.parse(index, handler);
-            else
-                parser.parse(getObrURL().toExternalForm(), handler);
-        }
-        catch (ParserConfigurationException e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-        catch (SAXException e)
-        {
-            System.out.println("Failed to parse " + index);
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-        catch (IOException e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    private String getAuth(String url) throws IOException
-    {
-        if (authFile == null)
-            return null;
-
-        if (authFile.lastModified() > authLastModified)
-        {
-            authMap.clear();
-            authMap.load(new FileInputStream(authFile));
-            
-            authLastModified = authFile.lastModified();
-        }
-
-        String authKey = "";
-
-        for (Object okey : authMap.keySet())
-        {
-            String key = (String) okey;
-            if (url.startsWith(key) && key.length() > authKey.length())
-                authKey = key;
-        }
-
-        return authMap.getProperty(authKey);
-    }
-
-    private File syncOBRIndex()
-    {
-        File file = null;
-        if ("file".equals(getObrURL().getProtocol()))
-        {
-            try
-            {
-                file = new File(getObrURL().toURI());
-            }
-            catch (URISyntaxException e)
-            {
-                // should be impossible ?
-                throw new IllegalStateException("Failed to convert file url to uri", e);
-            }
-        }
-        else
-        {
-            file = getObrlCache();
-            if (isUpdated())
-            {
-                cacheIndex(file);
-            }
-        }
-
-        return file;
-    }
-
-    private void cacheIndex(File file)
-    {
-        InputStream in = null;
-        OutputStream out = null;
-
-        try
-        {
-            URL url = getObrURL();
-            URLConnection c = url.openConnection();
-            String auth = getAuth(url.toString());
-            if (auth != null)
-            {
-                c.setRequestProperty("Authorization", "Basic " + auth);
-            }
-
-            c.connect();
-            in = c.getInputStream();
-            if (!file.getParentFile().exists() && !file.getParentFile().mkdirs())
-            {
-                throw new IOException("Failed to create obr cache dir "
-                    + file.getParentFile());
-            }
-            out = new FileOutputStream(file);
-            stream(in, out);
-        }
-        catch (IOException e)
-        {
-            e.printStackTrace();
-            getObrlCache().setLastModified(0);
-        }
-        finally
-        {
-            close(in, out);
-        }
-    }
-
-    private void close(InputStream in, OutputStream out)
-    {
-        if (in != null)
-        {
-            try
-            {
-                in.close();
-            }
-            catch (IOException e)
-            {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-        }
-        if (out != null)
-        {
-            try
-            {
-                out.close();
-            }
-            catch (IOException e)
-            {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-        }
-    }
-
-    private void stream(InputStream in, OutputStream out) throws IOException
-    {
-        byte[] buf = new byte[1024];
-        for (;;)
-        {
-            int r = in.read(buf);
-            if (r == -1)
-            {
-                break;
-            }
-            out.write(buf, 0, r);
-        }
-        out.flush();
-    }
-
-    private boolean isUpdated()
-    {
-        if (getObrlCache() == null)
-            return false;
-
-        if (!getObrlCache().exists())
-            return true;
-
-        return !offline && getObrlCache().lastModified() + getUpdatePeriod() < System.currentTimeMillis();
-    }
-
-    private URL getObrURL()
-    {
-        return obrURL;
-    }
-
-    private File getObrlCache()
-    {
-        return obrlCache;
-    }
-
-    private File getBundleCache()
-    {
-        return bundleCache;
-    }
-
-    private long getUpdatePeriod()
-    {
-        return updatePeriod;
-    }
-}
diff --git a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/CachingOBRBundleRepository.java b/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/CachingOBRBundleRepository.java
deleted file mode 100644
index 14e3687..0000000
--- a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/CachingOBRBundleRepository.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.obr.impl;
-
-import java.io.File;
-import java.lang.ref.SoftReference;
-import java.net.URL;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-
-public class CachingOBRBundleRepository extends AbstractOBRBundleRepository
-{
-
-    private SoftReference<List<ISigilBundle>> bundles;
-
-    public CachingOBRBundleRepository(String id, URL repositoryURL, File obrCache, File bundleCache, long updatePeriod, File authFile, boolean offline)
-    {
-        super(id, repositoryURL, obrCache, bundleCache, updatePeriod, authFile, offline);
-    }
-
-    @Override
-    public void accept(IRepositoryVisitor visitor, int options)
-    {
-        for (ISigilBundle b : loadFromCache(options))
-        {
-            if (!visitor.visit(b))
-            {
-                break;
-            }
-        }
-    }
-
-    public synchronized void refresh()
-    {
-        super.refresh();
-        if (bundles != null)
-        {
-            bundles.clear();
-            notifyChange();
-        }
-    }
-
-    private synchronized List<ISigilBundle> loadFromCache(int options)
-    {
-        List<ISigilBundle> cached = bundles == null ? null : bundles.get();
-        if (cached == null)
-        {
-            final LinkedList<ISigilBundle> read = new LinkedList<ISigilBundle>();
-            readBundles(new OBRListener()
-            {
-                public void handleBundle(ISigilBundle bundle)
-                {
-                    read.add(bundle);
-                }
-            });
-            cached = read;
-            bundles = new SoftReference<List<ISigilBundle>>(cached);
-        }
-
-        return cached;
-    }
-}
diff --git a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/NonCachingOBRBundleRepository.java b/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/NonCachingOBRBundleRepository.java
deleted file mode 100644
index 06a6806..0000000
--- a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/NonCachingOBRBundleRepository.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.obr.impl;
-
-import java.io.File;
-import java.net.URL;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-
-public class NonCachingOBRBundleRepository extends AbstractOBRBundleRepository
-{
-
-    /*public static void main(String[] args) throws Exception {
-    	String url = args[0];
-    	String obr = args[1];
-    	String cache = args[2];
-    	String update = args[3];
-    	BldCore.init();
-    	NonCachingOBRBundleRepository rep = new NonCachingOBRBundleRepository( "main", new URL(url), new File(obr), new File(cache), Long.parseLong(update));
-    	rep.accept(new IRepositoryVisitor() {
-    		public boolean visit(ISigilBundle bundle) {
-    			System.out.println( "Found " + bundle );
-    			return true;
-    		}
-    	});
-    } */
-
-    public NonCachingOBRBundleRepository(String id, URL repositoryURL, File obrCache, File bundleCache, long updatePeriod, File authFile, boolean offline)
-    {
-        super(id, repositoryURL, obrCache, bundleCache, updatePeriod, authFile, offline);
-    }
-
-    @Override
-    public void accept(final IRepositoryVisitor visitor, int options)
-    {
-        readBundles(new OBRListener()
-        {
-            boolean visit = true;
-
-            public void handleBundle(ISigilBundle bundle)
-            {
-                if (visit)
-                {
-                    visit = visitor.visit(bundle);
-                }
-            }
-        });
-    }
-
-}
diff --git a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/OBRHandler.java b/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/OBRHandler.java
deleted file mode 100644
index 0979e41..0000000
--- a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/OBRHandler.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.sigil.common.obr.impl;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.LDAPExpr;
-import org.apache.felix.sigil.common.osgi.LDAPParseException;
-import org.apache.felix.sigil.common.osgi.LDAPParser;
-import org.apache.felix.sigil.common.osgi.SimpleTerm;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.xml.sax.Attributes;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-final class OBRHandler extends DefaultHandler
-{
-    private static final String PACKAGE = "package";
-    private static final String URI = "uri";
-    private static final String PRESENTATION_NAME = "presentationname";
-    private static final String VERSION = "version";
-    private static final String SYMBOLIC_NAME = "symbolicname";
-    private final File cacheDir;
-    private final URL obrURL;
-    private final OBRListener listener;
-
-    private HashSet<String> sanity = new HashSet<String>();
-    private Locator locator;
-    private ISigilBundle bundle;
-    private IPackageExport export;
-    private int depth;
-
-    public OBRHandler(URL obrURL, File bundleCache, OBRListener listener)
-    {
-        this.obrURL = obrURL;
-        this.cacheDir = bundleCache;
-        this.listener = listener;
-    }
-
-    public void setDocumentLocator(Locator locator)
-    {
-        this.locator = locator;
-    }
-
-    public void startElement(String uri, String localName, String qName,
-        Attributes attributes) throws SAXException
-    {
-        if (depth++ == 0 && !"repository".equals(qName))
-        {
-            throw new SAXParseException(
-                "Invalid OBR document, expected repository top level element", locator);
-        }
-        else if ("resource".equals(qName))
-        {
-            startResource(attributes);
-        }
-        else if ("capability".equals(qName))
-        {
-            startCapability(attributes);
-        }
-        else if ("require".equals(qName))
-        {
-            startRequire(attributes);
-        }
-        else if ("p".equals(qName))
-        {
-            startProperty(attributes);
-        }
-    }
-
-    public void endElement(String uri, String localName, String qName)
-        throws SAXException
-    {
-        depth--;
-        if ("resource".equals(qName))
-        {
-            endResource();
-        }
-        else if ("capability".equals(qName))
-        {
-            endCapability();
-        }
-        else if ("require".equals(qName))
-        {
-            endRequire();
-        }
-        else if ("p".equals(qName))
-        {
-            endProperty();
-        }
-    }
-
-    private void startResource(Attributes attributes) throws SAXException
-    {
-        try
-        {
-            String uri = attributes.getValue("", URI);
-            if (uri.endsWith(".jar"))
-            {
-                if (!sanity.add(uri))
-                {
-                    // TODO replace with logging framework for build
-                    // should hook in with ide/build logging
-                    System.err.println(obrURL + " contains duplicate uri: " + uri);
-                }
-                
-                ISigilBundle b = ModelElementFactory.getInstance().newModelElement(
-                    ISigilBundle.class);
-                IBundleModelElement info = ModelElementFactory.getInstance().newModelElement(
-                    IBundleModelElement.class);
-                info.setSymbolicName(attributes.getValue("", SYMBOLIC_NAME));
-                info.setVersion(VersionTable.getVersion(attributes.getValue("", VERSION)));
-                info.setName(attributes.getValue("", PRESENTATION_NAME));
-                URI l = makeAbsolute(uri);
-                info.setUpdateLocation(l);
-                if ("file".equals(l.getScheme()))
-                {
-                    b.setLocation(new File(l));
-                }
-                else
-                {
-                    b.setLocation(cachePath(info));
-                }
-                b.setBundleInfo(info);
-                bundle = b;
-            }
-        }
-        catch (Exception e)
-        {
-            throw new SAXParseException("Failed to build bundle info", locator, e);
-        }
-    }
-
-    private URI makeAbsolute(String uri) throws URISyntaxException
-    {
-        URI l = new URI(uri);
-        if (!l.isAbsolute())
-        {
-            String base = obrURL.toExternalForm();
-            int i = base.lastIndexOf("/");
-            if (i != -1)
-            {
-                base = base.substring(0, i);
-                l = new URI(base + (uri.startsWith("/") ? "" : "/") + uri);
-            }
-        }
-        return l;
-    }
-
-    private File cachePath(IBundleModelElement info)
-    {
-        return new File(cacheDir, info.getSymbolicName() + "_" + info.getVersion()
-            + ".jar");
-    }
-
-    private void startCapability(Attributes attributes)
-    {
-        if (bundle != null)
-        {
-            if (PACKAGE.equals(attributes.getValue("", "name")))
-            {
-                export = ModelElementFactory.getInstance().newModelElement(
-                    IPackageExport.class);
-            }
-        }
-    }
-
-    private void startRequire(Attributes attributes) throws SAXParseException
-    {
-        if (bundle != null)
-        {
-            String name = attributes.getValue("name");
-            if (PACKAGE.equals(name))
-            {
-                IPackageImport pi = ModelElementFactory.getInstance().newModelElement(
-                    IPackageImport.class);
-                try
-                {
-                    LDAPExpr expr = LDAPParser.parseExpression(attributes.getValue("filter"));
-                    pi.setPackageName(decodePackage(expr, locator));
-                    pi.setVersions(decodeVersions(expr, locator));
-                    pi.setOptional(Boolean.valueOf(attributes.getValue("optional")));
-                    bundle.getBundleInfo().addImport(pi);
-                }
-                catch (LDAPParseException e)
-                {
-                    throw new SAXParseException("Failed to parse filter", locator, e);
-                }
-            }
-            else if ("bundle".equals(name))
-            {
-                IRequiredBundle b = ModelElementFactory.getInstance().newModelElement(
-                    IRequiredBundle.class);
-                try
-                {
-                    LDAPExpr expr = LDAPParser.parseExpression(attributes.getValue("filter"));
-                    b.setSymbolicName(decodeSymbolicName(expr, locator));
-                    b.setVersions(decodeVersions(expr, locator));
-                    b.setOptional(Boolean.valueOf(attributes.getValue("optional")));
-                    bundle.getBundleInfo().addRequiredBundle(b);
-                }
-                catch (Exception e)
-                {
-                    System.err.println("Failed to parse filter in bundle "
-                        + bundle.getBundleInfo().getSymbolicName());
-                    throw new SAXParseException("Failed to parse filter in bundle "
-                        + bundle.getBundleInfo().getSymbolicName(), locator, e);
-                }
-            }
-            //else if ( "ee".equals( name ) ) {
-            // TODO ignore for now...
-            //}
-            //else if ( "service".equals( name ) ) {
-            // TODO ignore for now...
-            //}
-            //else {
-            //	for ( int i = 0; i < attributes.getLength(); i++ ) {
-            //		System.out.println( "Found requirement " + attributes.getValue(i) );				
-            //	}
-            //}
-        }
-    }
-
-    private static VersionRange decodeVersions(LDAPExpr expr, Locator locator)
-        throws SAXParseException
-    {
-        try
-        {
-            return VersionRangeHelper.decodeVersions(expr);
-        }
-        catch (NumberFormatException e)
-        {
-            throw new SAXParseException(e.getMessage(), locator);
-        }
-    }
-
-    private void startProperty(Attributes attributes)
-    {
-        if (export != null)
-        {
-            String name = attributes.getValue("", "n");
-            String value = attributes.getValue("", "v");
-            if (PACKAGE.equals(name))
-            {
-                export.setPackageName(value);
-            }
-            else if ("uses".equals(name))
-            {
-                String[] split = value.split(",");
-                export.setUses(Arrays.asList(split));
-            }
-            else if ("version".equals(name))
-            {
-                export.setVersion(VersionTable.getVersion(value));
-            }
-        }
-    }
-
-    private void endResource()
-    {
-        if (bundle != null)
-        {
-            listener.handleBundle(bundle);
-            bundle = null;
-        }
-    }
-
-    private void endCapability()
-    {
-        if (bundle != null)
-        {
-            if (export != null)
-            {
-                bundle.getBundleInfo().addExport(export);
-                export = null;
-            }
-        }
-    }
-
-    private void endRequire()
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    private void endProperty()
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    private static String decodePackage(LDAPExpr expr, Locator locator)
-        throws SAXParseException
-    {
-        ArrayList<SimpleTerm> terms = new ArrayList<SimpleTerm>(1);
-
-        findTerms("package", expr, terms);
-
-        if (terms.isEmpty())
-        {
-            throw new SAXParseException("Missing name filter in " + expr, locator);
-        }
-
-        return terms.get(0).getRval();
-    }
-
-    private static String decodeSymbolicName(LDAPExpr expr, Locator locator)
-        throws SAXParseException
-    {
-        ArrayList<SimpleTerm> terms = new ArrayList<SimpleTerm>(1);
-
-        findTerms("symbolicname", expr, terms);
-
-        if (terms.isEmpty())
-        {
-            throw new SAXParseException("Missing name filter in " + expr, locator);
-        }
-
-        return terms.get(0).getRval();
-    }
-
-    private static void findTerms(String string, LDAPExpr expr, List<SimpleTerm> terms)
-        throws SAXParseException
-    {
-        if (expr instanceof SimpleTerm)
-        {
-            SimpleTerm term = (SimpleTerm) expr;
-            if (term.getName().equals(string))
-            {
-                terms.add(term);
-            }
-        }
-        else
-        {
-            for (LDAPExpr c : expr.getChildren())
-            {
-                findTerms(string, c, terms);
-            }
-        }
-    }
-}
diff --git a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/OBRListener.java b/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/OBRListener.java
deleted file mode 100644
index 12c9894..0000000
--- a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/OBRListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.obr.impl;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-
-public interface OBRListener
-{
-    void handleBundle(ISigilBundle bundle);
-}
diff --git a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/VersionRangeHelper.java b/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/VersionRangeHelper.java
deleted file mode 100644
index e5aff3a..0000000
--- a/sigil/common/obr/src/org/apache/felix/sigil/common/obr/impl/VersionRangeHelper.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.obr.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.sigil.common.osgi.LDAPExpr;
-import org.apache.felix.sigil.common.osgi.Not;
-import org.apache.felix.sigil.common.osgi.Ops;
-import org.apache.felix.sigil.common.osgi.SimpleTerm;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.osgi.framework.Version;
-
-public class VersionRangeHelper
-{
-
-    public static VersionRange decodeVersions(LDAPExpr expr) throws NumberFormatException
-    {
-        ArrayList<LDAPExpr> terms = new ArrayList<LDAPExpr>(1);
-
-        findExpr("version", expr, terms);
-
-        if (terms.isEmpty())
-        {
-            // woo hoo!
-            return VersionRange.ANY_VERSION;
-        }
-        else
-        {
-            switch (terms.size())
-            {
-                case 1:
-                {
-                    return parseSimpleVersionRange(terms.get(0));
-                }
-                case 2:
-                {
-                    return parseCompoundVersionRange(terms.get(0), terms.get(1));
-                }
-                default:
-                {
-                    // (&(version>=min)(!(version=min))(version<=max)(!(version=max))) 	- (min,max) - not dealt with!!
-                    // (&(|(version>min)(version=min))(|(version<max)(version=max))) 	- [min,max] - not dealt with!!
-                    throw new NumberFormatException(
-                        "Failed to parse complicated version expression " + expr);
-                }
-            }
-        }
-    }
-
-    // (&(version>=min)(version<=max)) 									- [min,max]
-    // (&(version>min)(version<max))									- (min,max)
-    //
-    // (&(!(version<min))(!(version>max)))								- [min,max]
-    // (&(!(version<=min))(!(version>=max)) 							- (min,max)
-    private static VersionRange parseCompoundVersionRange(LDAPExpr left, LDAPExpr right)
-        throws NumberFormatException
-    {
-        VersionRange one = parseSimpleVersionRange(left);
-        VersionRange two = parseSimpleVersionRange(right);
-
-        // sanity check
-        if (one.isPointVersion() || two.isPointVersion())
-        {
-            throw new NumberFormatException(
-                "Unexpected point version in compound expression " + left);
-        }
-
-        VersionRange max = one.getFloor().equals(Version.emptyVersion) ? one : two;
-        VersionRange min = max == one ? two : one;
-
-        return new VersionRange(min.isOpenFloor(), min.getFloor(), max.getCeiling(),
-            max.isOpenCeiling());
-    }
-
-    // possible variations				
-    // (version=v)														- [v,v]
-    //
-    // (version>=min)													- [min,*)
-    // (version<=max)													- [0,max]
-    //
-    // (version>min)													- (min,*)
-    // (version<max)													- [0,max)
-    //
-    // (!(version>max))													- [0,max]
-    // (!(version<min))													- [min,*)
-    // (!(version>=max))												- [0,max)
-    // (!(version<=min))												- (0,*)
-    private static VersionRange parseSimpleVersionRange(LDAPExpr expr)
-        throws NumberFormatException
-    {
-        Version min = Version.emptyVersion;
-        Version max = VersionRange.INFINITE_VERSION;
-        boolean openFloor = false;
-        boolean openCeiling = false;
-        if (expr instanceof Not)
-        {
-            Not n = (Not) expr;
-            SimpleTerm t = (SimpleTerm) n.getEx();
-            if (t.getOp() == Ops.EQ)
-            {
-                throw new NumberFormatException(
-                    "Unexpected point version in negated expression " + expr);
-            }
-            if (!isMax(t.getOp()))
-            {
-                max = toVersion(t);
-                openCeiling = !openFloor(t);
-            }
-            else if (!isMin(t.getOp()))
-            {
-                min = toVersion(t);
-                openFloor = !openCeiling(t);
-            }
-            else
-            {
-                throw new IllegalStateException("Unexpected operator " + t.getOp());
-            }
-        }
-        else
-        {
-            SimpleTerm t = (SimpleTerm) expr;
-            if (t.getOp().equals(Ops.EQ))
-            {
-                max = toVersion(t);
-                min = max;
-                openFloor = false;
-                openCeiling = false;
-            }
-            else if (isMax(t.getOp()))
-            {
-                max = toVersion(t);
-                openCeiling = openCeiling(t);
-            }
-            else if (isMin(t.getOp()))
-            {
-                min = toVersion(t);
-                openFloor = openFloor(t);
-            }
-            else
-            {
-                throw new IllegalStateException("Unexpected operator " + t.getOp());
-            }
-        }
-
-        return new VersionRange(openFloor, min, max, openCeiling);
-    }
-
-    private static Version toVersion(SimpleTerm t)
-    {
-        return VersionTable.getVersion(t.getRval());
-    }
-
-    private static boolean isMax(Ops op)
-    {
-        return op == Ops.LE || op == Ops.LT;
-    }
-
-    private static boolean isMin(Ops op)
-    {
-        return op == Ops.GE || op == Ops.GT;
-    }
-
-    private static boolean openFloor(SimpleTerm t)
-    {
-        return t.getOp() == Ops.GT;
-    }
-
-    private static boolean openCeiling(SimpleTerm t)
-    {
-        return t.getOp() == Ops.LT;
-    }
-
-    private static void findExpr(String string, LDAPExpr expr, List<LDAPExpr> terms)
-    {
-        if (expr instanceof SimpleTerm)
-        {
-            SimpleTerm term = (SimpleTerm) expr;
-            if (term.getName().equals(string))
-            {
-                terms.add(term);
-            }
-        }
-        else if (expr instanceof Not)
-        {
-            Not not = (Not) expr;
-            if (not.getEx() instanceof SimpleTerm)
-            {
-                SimpleTerm term = (SimpleTerm) not.getEx();
-                if (term.getName().equals(string))
-                {
-                    terms.add(not);
-                }
-            }
-        }
-        else
-        {
-            for (LDAPExpr c : expr.getChildren())
-            {
-                findExpr(string, c, terms);
-            }
-        }
-    }
-}
diff --git a/sigil/common/osgi.test/.classpath b/sigil/common/osgi.test/.classpath
deleted file mode 100644
index c9ffd60..0000000
--- a/sigil/common/osgi.test/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/common/osgi.test/.project b/sigil/common/osgi.test/.project
deleted file mode 100644
index a183385..0000000
--- a/sigil/common/osgi.test/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.common.osgi.test</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/common/osgi.test/sigil.properties b/sigil/common/osgi.test/sigil.properties
deleted file mode 100644
index 36662f6..0000000
--- a/sigil/common/osgi.test/sigil.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--bundles: \
-	org.apache.felix.sigil.common.osgi.test, \
-
--sourcedirs: \
-	src, \
-
--fragment: \
-	org.apache.felix.sigil.common.osgi;version=0.9.0, \
-
--imports: \
-	junit.framework;version=3.8.2, \
-
-# end
diff --git a/sigil/common/osgi.test/src/org/apache/felix/sigil/common/osgi/LDAPParserTest.java b/sigil/common/osgi.test/src/org/apache/felix/sigil/common/osgi/LDAPParserTest.java
deleted file mode 100644
index d03bb31..0000000
--- a/sigil/common/osgi.test/src/org/apache/felix/sigil/common/osgi/LDAPParserTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import junit.framework.TestCase;
-
-public class LDAPParserTest extends TestCase
-{
-    private static final SimpleTerm A_B = new SimpleTerm("a", Ops.EQ, "b");
-    private static final SimpleTerm C_D = new SimpleTerm("c", Ops.EQ, "d");
-
-    public void testSimple()
-    {
-        LDAPExpr expr = LDAPParser.parseExpression("(a=b)");
-        assertEquals(expr, A_B);
-    }
-
-    public void testSimpleWhiteSpace()
-    {
-        LDAPExpr expr = LDAPParser.parseExpression("  ( a = b )  ");
-        assertEquals(expr, A_B);
-    }
-
-    public void testNot()
-    {
-        LDAPExpr expr = LDAPParser.parseExpression("(!(a=b))");
-        assertEquals(expr, Not.apply(A_B));
-    }
-
-    public void testAnd()
-    {
-        LDAPExpr expr = LDAPParser.parseExpression("(&(a=b)(c=d))");
-        assertEquals(expr, And.apply(A_B, C_D));
-    }
-
-    public void testOr()
-    {
-        LDAPExpr expr = LDAPParser.parseExpression("(|(a=b)(c=d))");
-        assertEquals(expr, Or.apply(A_B, C_D));
-    }
-
-    public void testParseException()
-    {
-        try
-        {
-            LDAPExpr expr = LDAPParser.parseExpression(".(a=b)");
-            fail("Unexpectedly parsed invalid ldap expr " + expr);
-        }
-        catch (LDAPParseException e)
-        {
-            // expected
-        }
-    }
-}
diff --git a/sigil/common/osgi/.classpath b/sigil/common/osgi/.classpath
deleted file mode 100644
index c9ffd60..0000000
--- a/sigil/common/osgi/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/common/osgi/.project b/sigil/common/osgi/.project
deleted file mode 100644
index 9702092..0000000
--- a/sigil/common/osgi/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.common.osgi</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/common/osgi/.settings/org.eclipse.jdt.core.prefs b/sigil/common/osgi/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 72e1348..0000000
--- a/sigil/common/osgi/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,258 +0,0 @@
-#Thu Sep 17 16:08:04 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/common/osgi/.settings/org.eclipse.jdt.ui.prefs b/sigil/common/osgi/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 65a4192..0000000
--- a/sigil/common/osgi/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:08:04 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/common/osgi/DEPENDENCIES b/sigil/common/osgi/DEPENDENCIES
deleted file mode 100644
index 6e85a6c..0000000
--- a/sigil/common/osgi/DEPENDENCIES
+++ /dev/null
@@ -1,20 +0,0 @@
-Apache Felix Sigil Common OSGi
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
diff --git a/sigil/common/osgi/NOTICE b/sigil/common/osgi/NOTICE
deleted file mode 100644
index ea0a322..0000000
--- a/sigil/common/osgi/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Common OSGi
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/common/osgi/build.xml b/sigil/common/osgi/build.xml
deleted file mode 100644
index 8f55817..0000000
--- a/sigil/common/osgi/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="common.osgi" default="build">
-      <import file="../build.xml"/>
-</project>
diff --git a/sigil/common/osgi/ivy.xml b/sigil/common/osgi/ivy.xml
deleted file mode 100644
index a28cff4..0000000
--- a/sigil/common/osgi/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.common.osgi"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.common.osgi" />
-   </publications>
-</ivy-module>
diff --git a/sigil/common/osgi/sigil.properties b/sigil/common/osgi/sigil.properties
deleted file mode 100644
index d31a08b..0000000
--- a/sigil/common/osgi/sigil.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--bundles: \
-	org.apache.felix.sigil.common.osgi, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-
--sourcedirs: \
-	src, \
-
--exports: \
-	org.apache.felix.sigil.common.osgi, \
-
--imports: \
-	org.apache.felix.sigil.common.osgi, \
-	org.osgi.framework, \
-
-# end
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/AbstractExpr.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/AbstractExpr.java
deleted file mode 100644
index 144ae55..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/AbstractExpr.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-public abstract class AbstractExpr implements LDAPExpr
-{
-    public void visit(ExprVisitor visitor)
-    {
-        visitor.visitExpr(this);
-        for (LDAPExpr expr : getChildren())
-        {
-            visitor.visitExpr(expr);
-        }
-    }
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/And.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/And.java
deleted file mode 100644
index 16d7b6e..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/And.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import java.util.Map;
-
-public class And extends AbstractExpr
-{
-    private LDAPExpr[] children;
-
-    public static LDAPExpr apply(LDAPExpr... terms)
-    {
-        if (terms == null)
-        {
-            throw new NullPointerException("terms cannot be null");
-        }
-        else if (terms.length == 0)
-        {
-            return Expressions.T;
-        }
-        else if (terms.length == 1)
-        {
-            return terms[0];
-        }
-        LDAPExpr[] filtered = new LDAPExpr[terms.length];
-        int ctr = 0;
-        for (int i = 0; i < terms.length; i++)
-        {
-            if (terms[i].equals(Expressions.F))
-                return Expressions.F;
-            if (terms[i].equals(Expressions.T))
-                continue;
-            filtered[ctr] = terms[i];
-            ctr++;
-        }
-        if (ctr == 0)
-        {
-            return Expressions.T;
-        }
-        else if (ctr == 1)
-        {
-            return filtered[0];
-        }
-        LDAPExpr[] andTerms = new LDAPExpr[ctr];
-        System.arraycopy(filtered, 0, andTerms, 0, ctr);
-
-        return new And(andTerms);
-    }
-
-    private And(LDAPExpr... children)
-    {
-        this.children = children;
-    }
-
-    public boolean eval(Map<String, ?> map)
-    {
-        for (int i = 0; i < children.length; i++)
-        {
-            if (!children[i].eval(map))
-            {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public LDAPExpr[] getChildren()
-    {
-        return children;
-    }
-
-    public void setChildren(LDAPExpr[] children)
-    {
-        this.children = children;
-    }
-
-    @Override
-    public boolean equals(Object other)
-    {
-        if (other instanceof And)
-        {
-            And that = (And) other;
-            if (children.length != that.children.length)
-            {
-                return false;
-            }
-            for (int i = 0; i < children.length; i++)
-            {
-                if (!children[i].equals(that.children[i]))
-                {
-                    return false;
-                }
-            }
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public String toString()
-    {
-        StringBuffer buf = new StringBuffer(256);
-        buf.append("(&");
-        for (int i = 0; i < children.length; i++)
-        {
-            buf.append(" ").append(children[i]).append(" ");
-        }
-        buf.append(")");
-        return buf.toString();
-    }
-
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/ExprVisitor.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/ExprVisitor.java
deleted file mode 100644
index 9cf5d36..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/ExprVisitor.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-public interface ExprVisitor
-{
-    void visitExpr(LDAPExpr expr);
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Expressions.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Expressions.java
deleted file mode 100644
index bb3cd81..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Expressions.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import java.util.Map;
-
-public class Expressions
-{
-
-    public static LDAPExpr and(LDAPExpr... terms)
-    {
-        return And.apply(terms);
-    }
-
-    public static LDAPExpr or(LDAPExpr... terms)
-    {
-        return Or.apply(terms);
-    }
-
-    public static LDAPExpr not(LDAPExpr e)
-    {
-        return Not.apply(e);
-    }
-
-    public static LDAPExpr T = Bool.TRUE;
-    public static LDAPExpr F = Bool.FALSE;
-
-    // supports direct use of wildcards for ease of testing, but not literal *s
-    public static SimpleTerm ex(String name, Ops op, String rhs)
-    {
-
-        rhs = rhs.replace('*', SimpleTerm.WILDCARD);
-        return new SimpleTerm(name, op, rhs);
-    }
-
-}
-
-class Bool implements LDAPExpr
-{
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1L;
-    public static final Bool TRUE = new Bool(true);
-    public static final Bool FALSE = new Bool(false);
-
-    private boolean bool;
-
-    public Bool(boolean bool)
-    {
-        this.bool = bool;
-    }
-
-    public boolean eval(Map<String, ?> map)
-    {
-        return bool;
-    }
-
-    public void visit(ExprVisitor v)
-    {
-    }
-
-    public LDAPExpr[] getChildren()
-    {
-        return CHILDLESS;
-    }
-
-    public String toString()
-    {
-        return "(" + bool + ")";
-    }
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/FilterValidator.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/FilterValidator.java
deleted file mode 100644
index b1c9d3d..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/FilterValidator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-public interface FilterValidator
-{
-
-    public static FilterValidator ACCEPT_ALL = new AcceptEverythingValidator();
-
-    boolean validate(LDAPExpr filter);
-
-    static class AcceptEverythingValidator implements FilterValidator
-    {
-
-        public boolean validate(LDAPExpr filter)
-        {
-            return true;
-        }
-
-    }
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/LDAPExpr.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/LDAPExpr.java
deleted file mode 100644
index 2a79b44..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/LDAPExpr.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import java.util.Map;
-
-public interface LDAPExpr 
-{
-
-    public static final LDAPExpr[] CHILDLESS = new LDAPExpr[0];
-
-    public static LDAPExpr ACCEPT_ALL = Expressions.T;
-
-    LDAPExpr[] getChildren();
-
-    void visit(ExprVisitor v);
-
-    boolean equals(Object other);
-
-    int hashCode();
-
-    boolean eval(Map<String, ?> map);
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/LDAPParseException.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/LDAPParseException.java
deleted file mode 100644
index bb2d1b9..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/LDAPParseException.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-public class LDAPParseException extends RuntimeException
-{
-    private static final long serialVersionUID = 2L;
-
-    private ParseState ps;
-    private static final String LINE_SEPARATOR = System.getProperty("line.separator",
-        "\\r\\n");
-
-    public LDAPParseException(String message, ParseState ps)
-    {
-        super(message);
-        this.ps = ps;
-    }
-
-    public LDAPParseException(String message)
-    {
-        super(message);
-    }
-
-    @Override
-    public String getMessage()
-    {
-        if (ps == null)
-        {
-            return super.getMessage();
-        }
-
-        String basicMessage = super.getMessage();
-        StringBuffer buf = new StringBuffer(basicMessage.length() + ps.str.length() * 2);
-        buf.append(basicMessage).append(LINE_SEPARATOR);
-        buf.append(ps.str).append(LINE_SEPARATOR);
-        for (int i = 0; i < ps.pos; i++)
-        {
-            buf.append(" ");
-        }
-        buf.append("^");
-        return buf.toString();
-    }
-
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/LDAPParser.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/LDAPParser.java
deleted file mode 100644
index de1cb51..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/LDAPParser.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import static org.apache.felix.sigil.common.osgi.Expressions.and;
-import static org.apache.felix.sigil.common.osgi.Expressions.not;
-import static org.apache.felix.sigil.common.osgi.Expressions.or;
-import static org.apache.felix.sigil.common.osgi.Ops.APPROX;
-import static org.apache.felix.sigil.common.osgi.Ops.EQ;
-import static org.apache.felix.sigil.common.osgi.Ops.GE;
-import static org.apache.felix.sigil.common.osgi.Ops.GT;
-import static org.apache.felix.sigil.common.osgi.Ops.LE;
-import static org.apache.felix.sigil.common.osgi.Ops.LT;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class LDAPParser
-{
-
-    private static final LDAPParser parser = new LDAPParser();
-
-    public static LDAPExpr parseExpression(String strExpr) throws LDAPParseException
-    {
-        return parser.parse(strExpr);
-    }
-
-    public LDAPExpr parse(String strExpr) throws LDAPParseException
-    {
-
-        if (strExpr == null || strExpr.trim().length() == 0)
-        {
-            return LDAPExpr.ACCEPT_ALL;
-        }
-
-        ParseState ps = new ParseState(strExpr);
-        LDAPExpr expr = parseExpr(ps);
-        ps.skipWhitespace();
-        if (!ps.isEndOfString())
-        {
-            error("expected end of expression ", ps);
-        }
-        return expr;
-    }
-
-    public LDAPExpr parseExpr(ParseState ps) throws LDAPParseException
-    {
-        ps.skipWhitespace();
-        if (!(ps.peek() == '('))
-        {
-            error("expected (", ps);
-        }
-        ps.read();
-        LDAPExpr expr = null;
-        ps.skipWhitespace();
-        char ch = ps.peek();
-        switch (ch)
-        {
-            case '&':
-                ps.readAndSkipWhiteSpace();
-                List<LDAPExpr> andList = new ArrayList<LDAPExpr>();
-                while (ps.peek() == '(')
-                {
-                    andList.add(parseExpr(ps));
-                    ps.skipWhitespace();
-                }
-                LDAPExpr[] andArr = andList.toArray(new LDAPExpr[andList.size()]);
-                expr = and(andArr);
-                break;
-            case '|':
-                ps.readAndSkipWhiteSpace();
-                List<LDAPExpr> orList = new ArrayList<LDAPExpr>();
-                while (ps.peek() == '(')
-                {
-                    orList.add(parseExpr(ps));
-                    ps.skipWhitespace();
-                }
-                LDAPExpr[] orArray = orList.toArray(new LDAPExpr[orList.size()]);
-                expr = or(orArray);
-                break;
-            case '!':
-                ps.readAndSkipWhiteSpace();
-                expr = not(parseExpr(ps));
-                break;
-            default:
-                if (isNameChar(ch))
-                {
-                    expr = parseSimple(ps);
-                }
-                else
-                {
-                    error("unexpected character: '" + ch + "'", ps);
-                }
-        }
-        ps.skipWhitespace();
-        if (ps.peek() != ')')
-        {
-            error("expected )", ps);
-        }
-        ps.read();
-        return expr;
-
-    }
-
-    void error(String message, ParseState ps) throws LDAPParseException
-    {
-        throw new LDAPParseException(message, ps);
-    }
-
-    private SimpleTerm parseSimple(ParseState ps) throws LDAPParseException
-    {
-        // read name
-        StringBuffer name = new StringBuffer(16);
-        for (char c = ps.peek(); !ps.isEndOfString() && isNameChar(c); c = ps.peek())
-        {
-            ps.read();
-            name.append(c);
-        }
-        ps.skipWhitespace();
-        Ops op = null;
-        // read op
-        if (ps.lookingAt("="))
-        {
-            op = EQ;
-            ps.skip(1);
-        }
-        else if (ps.lookingAt(">="))
-        {
-            op = GE;
-            ps.skip(2);
-        }
-        else if (ps.lookingAt("<="))
-        {
-            op = LE;
-            ps.skip(2);
-        }
-        else if (ps.lookingAt(">"))
-        {
-            op = GT;
-            ps.skip(1);
-        }
-        else if (ps.lookingAt("<"))
-        {
-            op = LT;
-            ps.skip(1);
-        }
-        else if (ps.lookingAt("-="))
-        {
-            op = APPROX;
-            ps.skip(2);
-        }
-        else if (ps.isEndOfString())
-        {
-            error("unexpected end of expression", ps);
-        }
-        else
-        {
-            error("unexpected character: '" + ps.peek() + "'", ps);
-        }
-        ps.skipWhitespace();
-
-        boolean escaped = false;
-        StringBuffer value = new StringBuffer(16);
-
-        while (!ps.isEndOfString() && !Character.isWhitespace(ps.peek())
-            && !(ps.peek() == ')' && !escaped))
-        {
-
-            char ch = ps.peek();
-
-            if (ch == '\\')
-            {
-                escaped = true;
-                ps.read();
-            }
-            else if (ch == '*')
-            {
-                if (escaped)
-                {
-                    value.append(ch);
-                    escaped = false;
-                }
-                else
-                {
-                    value.append(SimpleTerm.WILDCARD);
-                }
-                ps.read();
-            }
-            else if (isLiteralValue(ch))
-            {
-                if (escaped)
-                {
-                    error("incorrectly applied escape of '" + ch + "'", ps);
-                }
-                value.append(ps.read());
-            }
-            else if (isEscapedValue(ch))
-            {
-                if (!escaped)
-                {
-                    error("missing escape for '" + ch + "'", ps);
-                }
-                value.append(ps.read());
-                escaped = false;
-            }
-            else
-            {
-                error("unexpected character: '" + ps.peek() + "'", ps);
-            }
-        }
-        ps.skipWhitespace();
-
-        SimpleTerm expr = new SimpleTerm(name.toString(), op, value.toString());
-
-        return expr;
-    }
-
-    private boolean isNameChar(int ch)
-    {
-        return !(Character.isWhitespace(ch) || (ch == '(') || (ch == ')') || (ch == '<')
-            || (ch == '>') || (ch == '=') || (ch == '~') || (ch == '*') || (ch == '\\'));
-    }
-
-    private boolean isLiteralValue(int ch)
-    {
-        return !(Character.isWhitespace(ch) || (ch == '(') || (ch == ')') || (ch == '*'));
-    }
-
-    private boolean isEscapedValue(int ch)
-    {
-        return (ch == '(') || (ch == ')') || (ch == '*');
-    }
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Not.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Not.java
deleted file mode 100644
index fc6e9b9..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Not.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import java.util.Map;
-
-public class Not extends AbstractExpr
-{
-    private LDAPExpr[] children;
-
-    public static LDAPExpr apply(LDAPExpr e)
-    {
-        if (e == null)
-        {
-            throw new NullPointerException("cannot apply Not to a null expression");
-        }
-        if (e.equals(Expressions.T))
-        {
-            return Expressions.F;
-        }
-        if (e.equals(Expressions.F))
-        {
-            return Expressions.T;
-        }
-        return new Not(e);
-    }
-
-    private Not(LDAPExpr child)
-    {
-        this.children = new LDAPExpr[] { child };
-    }
-
-    public boolean eval(Map<String, ?> map)
-    {
-        return !children[0].eval(map);
-    }
-
-    public LDAPExpr getEx()
-    {
-        return children[0];
-    }
-
-    public LDAPExpr[] getChildren()
-    {
-        return children;
-    }
-
-    public void setChild(LDAPExpr child)
-    {
-        this.children = new LDAPExpr[] { child };
-    }
-
-    @Override
-    public boolean equals(Object other)
-    {
-        if (other instanceof Not)
-        {
-            Not that = (Not) other;
-            return children[0].equals(that.children[0]);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString()
-    {
-        StringBuffer buf = new StringBuffer(256);
-        buf.append("(!");
-        buf.append(" ").append(children[0]).append(" ");
-        buf.append(")");
-        return buf.toString();
-    }
-
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Ops.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Ops.java
deleted file mode 100644
index 05d66b9..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Ops.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-public enum Ops
-{
-    EQ, GE, LE, GT, LT, APPROX;
-
-    @Override
-    public String toString()
-    {
-        switch (this)
-        {
-            case EQ:
-                return "=";
-            case GE:
-                return ">=";
-            case LE:
-                return "<=";
-            case GT:
-                return ">";
-            case LT:
-                return "<";
-            case APPROX:
-                return "~=";
-            default:
-                return super.toString();
-        }
-    }
-
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Or.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Or.java
deleted file mode 100644
index 165d56e..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Or.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import java.util.Map;
-
-public class Or extends AbstractExpr
-{
-    private LDAPExpr[] children;
-
-    public static LDAPExpr apply(LDAPExpr... terms)
-    {
-        if (terms == null)
-        {
-            throw new NullPointerException("terms cannot be null");
-        }
-        else if (terms.length == 0)
-        {
-            return Expressions.T;
-        }
-        else if (terms.length == 1)
-        {
-            return terms[0];
-        }
-        LDAPExpr[] filtered = new LDAPExpr[terms.length];
-        int ctr = 0;
-        for (int i = 0; i < terms.length; i++)
-        {
-            if (terms[i].equals(Expressions.T))
-                return Expressions.T;
-            if (terms[i].equals(Expressions.F))
-                continue;
-            filtered[ctr] = terms[i];
-            ctr++;
-        }
-        if (ctr == 0)
-        {
-            return Expressions.F;
-        }
-        else if (ctr == 1)
-        {
-            return filtered[0];
-        }
-        LDAPExpr[] orTerms = new LDAPExpr[ctr];
-        System.arraycopy(filtered, 0, orTerms, 0, ctr);
-
-        return new Or(orTerms);
-    }
-
-    private Or(LDAPExpr... children)
-    {
-        this.children = children;
-    }
-
-    public boolean eval(Map<String, ?> map)
-    {
-        for (int i = 0; i < children.length; i++)
-        {
-            if (children[i].eval(map))
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public LDAPExpr[] getChildren()
-    {
-        return children;
-    }
-
-    public void setChildren(LDAPExpr[] children)
-    {
-        this.children = children;
-    }
-
-    @Override
-    public boolean equals(Object other)
-    {
-        if (other instanceof Or)
-        {
-            Or that = (Or) other;
-            if (children.length != that.children.length)
-            {
-                return false;
-            }
-            for (int i = 0; i < children.length; i++)
-            {
-                if (children[i].equals(that.children[i]))
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-        return false;
-    }
-
-    @Override
-    public String toString()
-    {
-        StringBuffer buf = new StringBuffer(256);
-        buf.append("(|");
-        for (int i = 0; i < children.length; i++)
-        {
-            buf.append(" ").append(children[i]).append(" ");
-        }
-        buf.append(")");
-        return buf.toString();
-    }
-
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/ParseState.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/ParseState.java
deleted file mode 100644
index f7f502d..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/ParseState.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import java.io.Serializable;
-
-/**
- * @author dave
- * 
- */
-class ParseState implements Serializable
-{
-    private static final long serialVersionUID = 1L;
-
-    int pos;
-
-    String str;
-
-    ParseState(String str)
-    {
-        this.str = str;
-    }
-
-    public boolean lookingAt(String start)
-    {
-        return str.substring(pos).startsWith(start);
-    }
-
-    public CharSequence skip(int n)
-    {
-        int end = pos + n < str.length() ? pos + n : str.length();
-        int start = pos;
-        pos = end;
-        return str.subSequence(start, end);
-    }
-
-    public char read()
-    {
-        char ch = str.charAt(pos);
-        if (pos < str.length())
-        {
-            pos++;
-        }
-        return ch;
-    }
-
-    public char readAndSkipWhiteSpace()
-    {
-        char ch = read();
-        skipWhitespace();
-        return ch;
-    }
-
-    char peek()
-    {
-        if (isEndOfString())
-        {
-            return (char) -1;
-        }
-        return str.charAt(pos);
-    }
-
-    boolean isEndOfString()
-    {
-        return pos == str.length();
-    }
-
-    void skipWhitespace()
-    {
-        while (pos < str.length() && Character.isWhitespace(str.charAt(pos)))
-        {
-            pos++;
-        }
-    }
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/SimpleTerm.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/SimpleTerm.java
deleted file mode 100644
index 03331ee..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/SimpleTerm.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import java.lang.reflect.Constructor;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Vector;
-
-public class SimpleTerm extends AbstractExpr
-{
-    public static final char WILDCARD = 2 ^ 16 - 1;
-    private static final String WILDCARD_STRING = new String(
-        new char[] { SimpleTerm.WILDCARD });
-
-    private Ops op;
-    private String name;
-    private String rval;
-
-    public SimpleTerm(String name, Ops op, String value)
-    {
-        this.op = op;
-        this.name = name.intern();
-        this.rval = value.intern();
-    }
-
-    public String getName()
-    {
-        return name;
-    }
-
-    public Ops getOp()
-    {
-        return op;
-    }
-
-    public String getRval()
-    {
-        return rval;
-    }
-
-    public boolean eval(Map<String, ?> map)
-    {
-
-        Object lval = map.get(name);
-        if (lval == null)
-        {
-            return false;
-        }
-        else if (Ops.EQ == op && WILDCARD_STRING.equals(lval))
-        {
-            return true;
-        }
-        // any match in the vector will do
-        else if (lval instanceof Vector<?>)
-        {
-            Vector<?> vec = (Vector<?>) lval;
-            for (Iterator<?> i = vec.iterator(); i.hasNext();)
-            {
-                if (check(i.next()))
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-        // any match in the array will do
-        else if (lval instanceof Object[])
-        {
-            Object[] arr = (Object[]) lval;
-            for (int i = 0; i < arr.length; i++)
-            {
-                if (check(arr[i]))
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-        return check(lval);
-    }
-
-    @SuppressWarnings("unchecked")
-    private boolean check(Object lval)
-    {
-        if (lval == null)
-        {
-            return false;
-        }
-        else if (Ops.EQ == op && WILDCARD_STRING.equals(lval))
-        {
-            return true;
-        }
-
-        Object rhs = null;
-
-        if (lval instanceof String)
-        {
-
-            if (Ops.APPROX == op)
-            {
-                rhs = collapseWhiteSpace(rval);
-                lval = collapseWhiteSpace((String) lval);
-            }
-
-            if (Ops.EQ == op || Ops.APPROX == op)
-            {
-                return stringCheck((String) lval);
-            }
-            // rhs already a string
-
-        }
-        else if (lval.getClass() == Byte.class)
-        {
-            rhs = Byte.valueOf(rval);
-        }
-        else if (lval.getClass() == Short.class)
-        {
-            rhs = Short.valueOf(rval);
-        }
-        else if (lval.getClass() == Integer.class)
-        {
-            rhs = Integer.valueOf(rval);
-        }
-        else if (lval.getClass() == Long.class)
-        {
-            rhs = Long.valueOf(rval);
-        }
-        else if (lval.getClass() == Float.class)
-        {
-            rhs = Float.valueOf(rval);
-        }
-        else if (lval.getClass() == Double.class)
-        {
-            rhs = Double.valueOf(rval);
-        }
-        else
-        {
-            try
-            {
-                Constructor<?> stringCtor = lval.getClass().getConstructor(
-                    new Class[] { String.class });
-                rhs = stringCtor.newInstance(rval);
-            }
-            catch (Exception e)
-            {
-                // log it
-                e.printStackTrace();
-                return false;
-            }
-        }
-
-        if (!(lval instanceof Comparable))
-        {
-            return Ops.EQ == op && lval.equals(rval);
-        }
-        else
-        {
-
-            Comparable<? super Object> lhs = (Comparable<? super Object>) lval;
-
-            int compare = lhs.compareTo(rhs);
-
-            switch (op)
-            {
-                case EQ:
-                    return compare == 0;
-                case APPROX:
-                    return compare == 0;
-                case GE:
-                    return compare >= 0;
-                case LE:
-                    return compare <= 0;
-                case GT:
-                    return compare > 0;
-                case LT:
-                    return compare < 0;
-            }
-        }
-
-        return false;
-    }
-
-    private boolean stringCheck(String lhs)
-    {
-
-        String rhs;
-        switch (op)
-        {
-            case EQ:
-            case APPROX:
-                rhs = rval;
-                break;
-            default:
-                return false;
-        }
-
-        int valLength = lhs.length();
-        int patLength = rval.length();
-
-        if (valLength == 0 && patLength == 0)
-        {
-            return true;
-        }
-
-        boolean wc = false;
-        int j = 0;
-        for (int i = 0; i < patLength; i++)
-        {
-            // trailing wildcards
-            char pc = rhs.charAt(i);
-            if (j == valLength)
-            {
-                if (pc != SimpleTerm.WILDCARD)
-                {
-                    return false;
-                }
-                continue;
-            }
-            if (pc == SimpleTerm.WILDCARD)
-            {
-                wc = true;
-                continue;
-            }
-            while (wc && j < valLength - 1 && lhs.charAt(j) != pc)
-            {
-                j++;
-            }
-            if (lhs.charAt(j) != pc)
-            {
-                return false;
-            }
-            else
-            {
-                wc = false;
-                j++;
-            }
-        }
-        return (wc || j == valLength);
-
-    }
-
-    private String collapseWhiteSpace(String in)
-    {
-        StringBuffer out = new StringBuffer(in.trim().length());
-        boolean white = false;
-        for (int i = 0; i < in.length(); i++)
-        {
-            char ch = in.charAt(i);
-            if (Character.isWhitespace(ch))
-            {
-                white = true;
-            }
-            else
-            {
-                if (white)
-                {
-                    out.append(" ");
-                    white = false;
-                }
-                out.append(ch);
-            }
-        }
-        return out.toString();
-    }
-
-    public LDAPExpr[] getChildren()
-    {
-        return CHILDLESS;
-    }
-
-    @Override
-    public boolean equals(Object other)
-    {
-        if (other instanceof SimpleTerm)
-        {
-            SimpleTerm that = (SimpleTerm) other;
-            return name.equals(that.name) && op.equals(that.op) && rval.equals(that.rval);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString()
-    {
-        return "(" + name + " " + op.toString() + " " + escape(rval) + ")";
-    }
-
-    private String escape(String raw)
-    {
-        StringBuffer buf = new StringBuffer(raw.length() + 10);
-        for (int i = 0; i < raw.length(); i++)
-        {
-            char ch = raw.charAt(i);
-            switch (ch)
-            {
-                case SimpleTerm.WILDCARD:
-                    buf.append("*");
-                    break;
-                case '(':
-                case ')':
-                case '*':
-                    buf.append("\\").append(ch);
-                    break;
-                default:
-                    buf.append(ch);
-            }
-        }
-        return buf.toString();
-    }
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Utils.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Utils.java
deleted file mode 100644
index feed6e8..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/Utils.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class Utils
-{
-    public static MapBuilder map(String name, Object value)
-    {
-        return new MapBuilder().put(name, value);
-    }
-
-    public static String toString(Map<String, Object> attrs)
-    {
-        if (attrs == null)
-        {
-            return "NULL";
-        }
-
-        StringBuffer buf = new StringBuffer(128);
-        List<String> keys = new ArrayList<String>(attrs.keySet());
-        Collections.sort(keys);
-        buf.append("{");
-
-        for (int i = 0; i < keys.size(); i++)
-        {
-            Object name = keys.get(i);
-            Object value = attrs.get(name);
-            buf.append(name).append("=").append(value).append(",");
-        }
-
-        if (buf.length() > 1)
-        {
-            buf.delete(buf.length() - 1, buf.length());
-        }
-
-        buf.append("}");
-
-        return buf.toString();
-    }
-
-    public static class MapBuilder
-    {
-        private Map<String, Object> map = new HashMap<String, Object>();
-
-        public MapBuilder put(String name, Object value)
-        {
-            map.put(name, value);
-
-            return this;
-        }
-
-        public Map<String, Object> toMap()
-        {
-            return map;
-        }
-    }
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/VersionRange.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/VersionRange.java
deleted file mode 100644
index efc445b..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/VersionRange.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-import org.osgi.framework.Version;
-
-public class VersionRange
-{
-
-    private static final long serialVersionUID = 1L;
-    public static final Version INFINITE_VERSION = new Version(Integer.MAX_VALUE,
-        Integer.MAX_VALUE, Integer.MAX_VALUE, "");
-    public static final VersionRange ANY_VERSION = new VersionRange(false,
-        Version.emptyVersion, INFINITE_VERSION, true);
-
-    private boolean openFloor;
-    private Version floor;
-    private Version ceiling;
-    private boolean openCeiling;
-
-    /**
-     * Interval constructor
-     * 
-     * @param openFloor Whether the lower bound of the range is inclusive (false) or exclusive (true).
-     * @param floor The lower bound version of the range.
-     * @param ceiling The upper bound version of the range.
-     * @param openCeiling Whether the upper bound of the range is inclusive (false) or exclusive (true).
-     */
-    public VersionRange(boolean openFloor, Version floor, Version ceiling, boolean openCeiling)
-    {
-        this.openFloor = openFloor;
-        this.floor = floor;
-        this.ceiling = ceiling;
-        this.openCeiling = openCeiling;
-    }
-
-    /**
-     * atLeast constructor
-     * 
-     * @param openFloor
-     * @param floor
-     */
-    public VersionRange(Version atLeast)
-    {
-        this.openFloor = false;
-        this.floor = atLeast;
-        this.ceiling = INFINITE_VERSION;
-        this.openCeiling = true;
-    }
-
-    public static VersionRange parseVersionRange(String val)
-        throws IllegalArgumentException, NumberFormatException
-    {
-        if (val == null || val.trim().length() == 0)
-        {
-            return ANY_VERSION;
-        }
-
-        boolean openFloor;
-        boolean openCeiling;
-        val = val.replaceAll("\\s", "");
-        val = val.replaceAll("\"", "");
-        int fst = val.charAt(0);
-        if (fst == '[')
-        {
-            openFloor = false;
-        }
-        else if (fst == '(')
-        {
-            openFloor = true;
-        }
-        else
-        {
-            Version atLeast = VersionTable.getVersion(val);
-            return new VersionRange(atLeast);
-        }
-
-        int lst = val.charAt(val.length() - 1);
-        if (lst == ']')
-        {
-            openCeiling = false;
-        }
-        else if (lst == ')')
-        {
-            openCeiling = true;
-        }
-        else
-        {
-            throw new IllegalArgumentException("illegal version range syntax " + val
-                + ": range must end in ')' or ']'");
-        }
-
-        String inner = val.substring(1, val.length() - 1);
-        String[] floorCeiling = inner.split(",");
-        if (floorCeiling.length != 2)
-        {
-            throw new IllegalArgumentException("illegal version range syntax "
-                + "too many commas");
-        }
-        Version floor = VersionTable.getVersion(floorCeiling[0]);
-        Version ceiling = "*".equals(floorCeiling[1]) ? INFINITE_VERSION
-            : Version.parseVersion(floorCeiling[1]);
-        return new VersionRange(openFloor, floor, ceiling, openCeiling);
-    }
-
-    public Version getCeiling()
-    {
-        return ceiling;
-    }
-
-    public Version getFloor()
-    {
-        return floor;
-    }
-
-    public boolean isOpenCeiling()
-    {
-        return openCeiling;
-    }
-
-    public boolean isOpenFloor()
-    {
-        return openFloor;
-    }
-
-    public boolean isPointVersion()
-    {
-        return !openFloor && !openCeiling && floor.equals(ceiling);
-    }
-
-    /**
-     * test a version to see if it falls in the range
-     * 
-     * @param version
-     * @return
-     */
-    public boolean contains(Version version)
-    {
-        if (version.equals(INFINITE_VERSION))
-        {
-            return ceiling.equals(INFINITE_VERSION);
-        }
-        else
-        {
-            return (version.compareTo(floor) > 0 && version.compareTo(ceiling) < 0)
-                || (!openFloor && version.equals(floor))
-                || (!openCeiling && version.equals(ceiling));
-        }
-    }
-
-    @Override
-    public int hashCode()
-    {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((ceiling == null) ? 0 : ceiling.hashCode());
-        result = prime * result + ((floor == null) ? 0 : floor.hashCode());
-        result = prime * result + (openCeiling ? 1231 : 1237);
-        result = prime * result + (openFloor ? 1231 : 1237);
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        final VersionRange other = (VersionRange) obj;
-        if (ceiling == null)
-        {
-            if (other.ceiling != null)
-                return false;
-        }
-        else if (!ceiling.equals(other.ceiling))
-            return false;
-        if (floor == null)
-        {
-            if (other.floor != null)
-                return false;
-        }
-        else if (!floor.equals(other.floor))
-            return false;
-        if (openCeiling != other.openCeiling)
-            return false;
-        if (openFloor != other.openFloor)
-            return false;
-        return true;
-    }
-
-    @Override
-    public String toString()
-    {
-        if (ANY_VERSION.equals(this))
-        {
-            return makeString(openFloor, Version.emptyVersion, INFINITE_VERSION,
-                openCeiling);
-        }
-        return makeString(openFloor, floor, ceiling, openCeiling);
-    }
-
-    private String makeString(boolean openFloor, Version floor, Version ceiling,
-        boolean openCeiling)
-    {
-        StringBuffer vr = new StringBuffer(32);
-        if (INFINITE_VERSION.equals(ceiling))
-        {
-            vr.append(Version.emptyVersion.equals(floor) ? "0" : floor.toString());
-        }
-        else
-        {
-            vr.append(openFloor ? "(" : "[");
-            String floorStr = Version.emptyVersion.equals(floor) ? "0" : floor.toString();
-            String ceilingStr = ceiling.toString();
-            vr.append(floorStr).append(",").append(ceilingStr);
-            vr.append(openCeiling ? ")" : "]");
-        }
-        return vr.toString();
-    }
-
-    public static VersionRange newInstance(Version pointVersion,
-        VersionRangeBoundingRule lowerBoundRule, VersionRangeBoundingRule upperBoundRule)
-    {
-        Version floor = null;
-        switch (lowerBoundRule)
-        {
-            case Any:
-                floor = VersionTable.getVersion(0, 0, 0);
-                break;
-            case Major:
-                floor = VersionTable.getVersion(pointVersion.getMajor(), 0, 0);
-                break;
-            case Minor:
-                floor = VersionTable.getVersion(pointVersion.getMajor(),
-                    pointVersion.getMinor(), 0);
-                break;
-            case Micro:
-                floor = VersionTable.getVersion(pointVersion.getMajor(),
-                    pointVersion.getMinor(), pointVersion.getMicro());
-                break;
-            case Exact:
-                floor = pointVersion;
-                break;
-        }
-
-        Version ceiling = null;
-        boolean openCeiling = true;
-        switch (upperBoundRule)
-        {
-            case Any:
-                ceiling = INFINITE_VERSION;
-                break;
-            case Major:
-                ceiling = VersionTable.getVersion(pointVersion.getMajor() + 1, 0, 0);
-                break;
-            case Minor:
-                ceiling = VersionTable.getVersion(pointVersion.getMajor(),
-                    pointVersion.getMinor() + 1, 0);
-                break;
-            case Micro:
-                ceiling = VersionTable.getVersion(pointVersion.getMajor(),
-                    pointVersion.getMinor(), pointVersion.getMicro() + 1);
-                break;
-            case Exact:
-                ceiling = pointVersion;
-                openCeiling = false;
-                break;
-        }
-
-        return new VersionRange(false, floor, ceiling, openCeiling);
-    }
-}
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/VersionRangeBoundingRule.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/VersionRangeBoundingRule.java
deleted file mode 100644
index cb2e236..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/VersionRangeBoundingRule.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.osgi;
-
-public enum VersionRangeBoundingRule
-{
-    Exact, Micro, Minor, Major, Any
-}
\ No newline at end of file
diff --git a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/VersionTable.java b/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/VersionTable.java
deleted file mode 100644
index 0b0b05e..0000000
--- a/sigil/common/osgi/src/org/apache/felix/sigil/common/osgi/VersionTable.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.common.osgi;
-
-import java.util.WeakHashMap;
-
-import org.osgi.framework.Version;
-
-/**
- * Cache of Versions used in Sigil backed by a WeakHashMap to conserve memory.
- * 
- * VersionTable.getVersion should be used in preference to new Version() or Version.parseVersion.
- * 
- * @author dave
- *
- */
-public class VersionTable
-{
-    private static final WeakHashMap<String, Version> versions = new WeakHashMap<String, Version>();
-
-    public static Version getVersion(String version)
-    {
-        synchronized (versions)
-        {
-            Version v = versions.get(version);
-            if (v == null)
-            {
-                v = Version.parseVersion(version);
-                versions.put(version, v);
-            }
-
-            return v;
-        }
-    }
-
-    public static Version getVersion(int major, int minor, int micro)
-    {
-        return getVersion(major, minor, micro, null);
-    }
-
-    public static Version getVersion(int major, int minor, int micro, String qualifier)
-    {
-        String key;
-
-        if (qualifier == null || qualifier.length() == 0)
-        {
-            key = major + "." + minor + "." + micro;
-        }
-        else
-        {
-            key = major + "." + minor + "." + micro + "." + qualifier;
-        }
-
-        synchronized (versions)
-        {
-            Version v = versions.get(key);
-            if (v == null)
-            {
-                v = new Version(major, minor, micro, qualifier);
-                versions.put(key, v);
-            }
-
-            return v;
-        }
-    }
-}
diff --git a/sigil/common/runtime/.classpath b/sigil/common/runtime/.classpath
deleted file mode 100644
index c9ffd60..0000000
--- a/sigil/common/runtime/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/common/runtime/.project b/sigil/common/runtime/.project
deleted file mode 100644
index 7ce9ec8..0000000
--- a/sigil/common/runtime/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.common.runtime</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/common/runtime/.settings/org.eclipse.jdt.core.prefs b/sigil/common/runtime/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 1be5ab2..0000000
--- a/sigil/common/runtime/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,258 +0,0 @@
-#Thu Sep 17 16:08:20 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/common/runtime/.settings/org.eclipse.jdt.ui.prefs b/sigil/common/runtime/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 13fd675..0000000
--- a/sigil/common/runtime/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:08:20 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/common/runtime/DEPENDENCIES b/sigil/common/runtime/DEPENDENCIES
deleted file mode 100644
index 5717b0c..0000000
--- a/sigil/common/runtime/DEPENDENCIES
+++ /dev/null
@@ -1,20 +0,0 @@
-Apache Felix Sigil Common Runtime
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
diff --git a/sigil/common/runtime/NOTICE b/sigil/common/runtime/NOTICE
deleted file mode 100644
index 8601917..0000000
--- a/sigil/common/runtime/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Common Runtime
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/common/runtime/build.xml b/sigil/common/runtime/build.xml
deleted file mode 100644
index aaf48be..0000000
--- a/sigil/common/runtime/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="common.runtime" default="build">
-  <import file="../build.xml"/>
-</project>
diff --git a/sigil/common/runtime/ivy.xml b/sigil/common/runtime/ivy.xml
deleted file mode 100644
index 0a697df..0000000
--- a/sigil/common/runtime/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.common.runtime"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.common.runtime" />
-   </publications>
-</ivy-module>
diff --git a/sigil/common/runtime/sigil.properties b/sigil/common/runtime/sigil.properties
deleted file mode 100644
index 75a520b..0000000
--- a/sigil/common/runtime/sigil.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--bundles: \
-	org.apache.felix.sigil.common.runtime, \
-
--contents: \
-	org.apache.felix.sigil.common.runtime.*, \
-	org.osgi.framework.launch, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-
--exports: \
-	org.apache.felix.sigil.common.runtime, \
-
--imports: \
-	org.apache.felix.sigil.common.runtime, \
-	org.osgi.framework, \
-	org.osgi.framework.launch, \
-	org.osgi.service.packageadmin, \
-
-header;Main-Class: org.apache.felix.sigil.common.runtime.Main
-
-# end
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/BundleForm.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/BundleForm.java
deleted file mode 100644
index bd373d1..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/BundleForm.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.common.runtime;
-
-import java.io.BufferedReader;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Set;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-import java.util.jar.Manifest;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.Constants;
-
-public class BundleForm
-{
-    public interface Resolver
-    {
-        URI[] resolve(URI base) throws URISyntaxException;
-    }
-
-    public interface ResolutionContext
-    {
-        Resolver findResolver(URI uri);
-    }
-
-    private static final Resolver NULL_RESOLVER = new Resolver()
-    {
-
-        public URI[] resolve(URI base)
-        {
-            return new URI[] { base };
-        }
-
-    };
-    private static final ResolutionContext NULL_CONTEXT = new ResolutionContext()
-    {
-        public Resolver findResolver(URI uri)
-        {
-            return NULL_RESOLVER;
-        }
-    };
-
-    public static class BundleStatus
-    {
-        private String location;
-        private String bundleSymbolicName;
-        private String version;
-        private long id;
-        private int status;
-
-        public String getLocation()
-        {
-            return location;
-        }
-
-        public void setLocation(String location)
-        {
-            this.location = location;
-        }
-
-        public String getBundleSymbolicName()
-        {
-            return bundleSymbolicName;
-        }
-
-        public void setBundleSymbolicName(String bundleSymbolicName)
-        {
-            this.bundleSymbolicName = bundleSymbolicName;
-        }
-
-        public String getVersion()
-        {
-            return version;
-        }
-
-        public void setVersion(String version)
-        {
-            this.version = version;
-        }
-
-        public long getId()
-        {
-            return id;
-        }
-
-        public void setId(long id)
-        {
-            this.id = id;
-        }
-
-        public void setStatus(int status)
-        {
-            this.status = status;
-        }
-
-        public int getStatus()
-        {
-            return status;
-        }
-
-        public boolean isMatch(BundleStatus n)
-        {
-            return bundleSymbolicName.equals(n.bundleSymbolicName)
-                && version.equals(n.version);
-        }
-    }
-
-    private URI[] bundles;
-    private Set<URI> startMap = new HashSet<URI>();
-
-    public BundleForm()
-    {
-    }
-
-    public BundleStatus[] resolve(ResolutionContext ctx) throws IOException,
-        URISyntaxException
-    {
-        if (ctx == null)
-        {
-            ctx = NULL_CONTEXT;
-        }
-
-        ArrayList<BundleStatus> ret = new ArrayList<BundleStatus>(bundles.length);
-
-        for (int i = 0; i < bundles.length; i++)
-        {
-            Resolver resolver = ctx.findResolver(bundles[i]);
-            if (resolver == null)
-            {
-                resolver = NULL_RESOLVER;
-            }
-            URI[] resolved = resolver.resolve(bundles[i]);
-            for (URI uri : resolved)
-            {
-                BundleStatus bundle = toBundle(uri, isStarted(bundles[i]));
-                if (bundle == null)
-                {
-                    throw new IllegalStateException("Failed to read bundle " + uri);
-                }
-                ret.add(bundle);
-            }
-        }
-
-        return ret.toArray(new BundleStatus[ret.size()]);
-
-    }
-
-    private BundleStatus toBundle(URI uri, boolean started) throws IOException
-    {
-        try
-        {
-            Manifest mf = findManifest(uri);
-            if (mf == null)
-                return null;
-            Attributes attr = mf.getMainAttributes();
-            String bsn = attr.getValue(Constants.BUNDLE_SYMBOLICNAME);
-            String ver = attr.getValue(Constants.BUNDLE_VERSION);
-            BundleStatus st = new BundleStatus();
-            st.setBundleSymbolicName(bsn);
-            st.setVersion(ver);
-            st.setLocation(uri.toURL().toExternalForm());
-            st.setStatus(started ? Bundle.ACTIVE : Bundle.INSTALLED);
-            return st;
-        }
-        catch (IllegalArgumentException e)
-        {
-            throw new IllegalArgumentException("Invalid uri " + uri, e);
-        }
-    }
-
-    private Manifest findManifest(URI uri) throws IOException
-    {
-        Manifest mf = null;
-
-        try
-        {
-            File f = new File(uri);
-            if (f.isDirectory())
-            {
-                f = new File(f, "META-INF/MANIFEST.MF");
-                if (f.isFile())
-                {
-                    FileInputStream fin = new FileInputStream(f);
-                    try
-                    {
-                        mf = new Manifest(fin);
-                    }
-                    finally
-                    {
-                        fin.close();
-                    }
-                }
-            }
-        }
-        catch (IllegalArgumentException e)
-        {
-            // fine
-        }
-
-        if (mf == null)
-        {
-            InputStream in = uri.toURL().openStream();
-            try
-            {
-                JarInputStream jin = new JarInputStream(in);
-                mf = jin.getManifest();
-                if (mf == null)
-                {
-                    for (;;)
-                    {
-                        JarEntry entry = jin.getNextJarEntry();
-                        if (entry == null)
-                            break;
-                        if ("META-INF/MANIFEST.MF".equals(entry.getName()))
-                        {
-                            mf = new Manifest(jin);
-                            break;
-                        }
-                    }
-                }
-
-            }
-            finally
-            {
-                in.close();
-            }
-        }
-        return mf;
-    }
-
-    public static BundleForm create(URL formURL) throws IOException, URISyntaxException
-    {
-        InputStream in = formURL.openStream();
-        try
-        {
-            BundleForm f = new BundleForm();
-            BufferedReader r = new BufferedReader(new InputStreamReader(in));
-            LinkedList<URI> locs = new LinkedList<URI>();
-            for (;;)
-            {
-                String l = r.readLine();
-                if (l == null)
-                    break;
-                l = l.trim();
-                if (!l.startsWith("#"))
-                {
-                    URI uri = URI.create(l);
-                    String status = uri.getScheme();
-                    uri = URI.create(uri.getSchemeSpecificPart());
-                    locs.add(uri);
-                    f.setStarted(uri, "start".equalsIgnoreCase(status));
-                }
-            }
-            f.setBundles(locs.toArray(new URI[locs.size()]));
-            return f;
-        }
-        finally
-        {
-            try
-            {
-                in.close();
-            }
-            catch (IOException e)
-            {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-        }
-    }
-
-    public void setBundles(URI[] bundles)
-    {
-        this.bundles = bundles;
-    }
-
-    public URI[] getBundles()
-    {
-        return bundles;
-    }
-
-    public boolean isStarted(URI uri)
-    {
-        return startMap.contains(uri);
-    }
-
-    public void setStarted(URI uri, boolean started)
-    {
-        if (started)
-        {
-            startMap.add(uri);
-        }
-        else
-        {
-            startMap.remove(uri);
-        }
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Client.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Client.java
deleted file mode 100644
index fd9a2c2..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Client.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.runtime.BundleForm.BundleStatus;
-import org.apache.felix.sigil.common.runtime.io.InstallAction;
-import org.apache.felix.sigil.common.runtime.io.RefreshAction;
-import org.apache.felix.sigil.common.runtime.io.StartAction;
-import org.apache.felix.sigil.common.runtime.io.StatusAction;
-import org.apache.felix.sigil.common.runtime.io.StopAction;
-import org.apache.felix.sigil.common.runtime.io.UninstallAction;
-import org.apache.felix.sigil.common.runtime.io.UpdateAction;
-import org.apache.felix.sigil.common.runtime.io.UpdateAction.Update;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-
-import static org.apache.felix.sigil.common.runtime.Runtime.PORT_PROPERTY;
-import static org.apache.felix.sigil.common.runtime.Runtime.ADDRESS_PROPERTY;
-
-/**
- * @author dave
- *
- */
-public class Client
-{
-    private Socket socket;
-    private DataInputStream in;
-    private DataOutputStream out;
-
-    public Client()
-    {
-    }
-
-    public void connect(Properties props) throws IOException
-    {
-        String v = props.getProperty(ADDRESS_PROPERTY);
-        InetAddress address = v == null ? null : InetAddress.getByName(v);
-        int port = Integer.parseInt(props.getProperty(PORT_PROPERTY, "0"));
-
-        if (port < 1)
-        {
-            throw new IOException("Missing or invalid port");
-        }
-
-        InetSocketAddress endpoint = new InetSocketAddress(address, port);
-
-        socket = new Socket();
-        socket.connect(endpoint);
-
-        Main.log("Connected to " + endpoint);
-
-        in = new DataInputStream(socket.getInputStream());
-        out = new DataOutputStream(socket.getOutputStream());
-    }
-
-    public boolean isConnected()
-    {
-        return socket != null;
-    }
-
-    public void disconnect() throws IOException
-    {
-        socket.close();
-        socket = null;
-        in = null;
-        out = null;
-    }
-
-    public void apply(BundleForm.BundleStatus[] newStatus) throws IOException,
-        BundleException
-    {
-        BundleStatus[] currentStatus = status();
-
-        stopOldBundles(currentStatus, newStatus);
-
-        boolean change = uninstallOldBundles(currentStatus, newStatus);
-        change |= installNewBundles(currentStatus, newStatus);
-
-        if (change)
-            refresh();
-
-        startNewBundles(newStatus);
-    }
-
-    public void refresh() throws IOException, BundleException
-    {
-        if (socket == null)
-            throw new IllegalStateException("Not connected");
-        new RefreshAction(in, out).client();
-    }
-
-    public long install(String url) throws IOException, BundleException
-    {
-        if (socket == null)
-            throw new IllegalStateException("Not connected");
-        return new InstallAction(in, out).client(url);
-    }
-
-    public void start(long bundle) throws IOException, BundleException
-    {
-        if (socket == null)
-            throw new IllegalStateException("Not connected");
-        new StartAction(in, out).client(bundle);
-    }
-
-    public void stop(long bundle) throws IOException, BundleException
-    {
-        if (socket == null)
-            throw new IllegalStateException("Not connected");
-        new StopAction(in, out).client(bundle);
-    }
-
-    public void uninstall(long bundle) throws IOException, BundleException
-    {
-        if (socket == null)
-            throw new IllegalStateException("Not connected");
-        new UninstallAction(in, out).client(bundle);
-    }
-
-    public void update(long bundle) throws IOException, BundleException
-    {
-        if (socket == null)
-            throw new IllegalStateException("Not connected");
-        Update update = new UpdateAction.Update(bundle, null);
-        new UpdateAction(in, out).client(update);
-    }
-
-    public void update(long bundle, String url) throws IOException, BundleException
-    {
-        if (socket == null)
-            throw new IllegalStateException("Not connected");
-        Update update = new UpdateAction.Update(bundle, url);
-        new UpdateAction(in, out).client(update);
-    }
-
-    public BundleStatus[] status() throws IOException, BundleException
-    {
-        if (socket == null)
-            throw new IllegalStateException("Not connected");
-        return new StatusAction(in, out).client();
-    }
-
-    private boolean installNewBundles(BundleStatus[] status, BundleStatus[] newStatus)
-        throws IOException, BundleException
-    {
-        boolean change = false;
-        for (BundleStatus n : newStatus)
-        {
-            boolean found = false;
-            for (BundleStatus o : status)
-            {
-                if (o.isMatch(n))
-                {
-                    update(o.getId(), n.getLocation());
-                    found = true;
-                    change = true;
-                    break;
-                }
-            }
-
-            if (!found)
-            {
-                install(n.getLocation());
-                change = true;
-            }
-        }
-
-        return change;
-    }
-
-    private void startNewBundles(BundleStatus[] newStatus) throws IOException,
-        BundleException
-    {
-        BundleStatus[] status = status();
-        for (BundleStatus n : newStatus)
-        {
-            if (n.getStatus() == Bundle.ACTIVE)
-            {
-                for (BundleStatus o : status)
-                {
-                    if (o.isMatch(n))
-                    {
-                        start(o.getId());
-                    }
-                }
-            }
-        }
-    }
-
-    private void stopOldBundles(BundleStatus[] status, BundleStatus[] newStatus)
-        throws IOException, BundleException
-    {
-        for (BundleStatus n : newStatus)
-        {
-            if (n.getStatus() == Bundle.INSTALLED)
-            {
-                for (BundleStatus o : status)
-                {
-                    if (o.getId() != 0)
-                    {
-                        if (o.isMatch(n))
-                        {
-                            stop(o.getId());
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private boolean uninstallOldBundles(BundleStatus[] status, BundleStatus[] newStatus)
-        throws IOException, BundleException
-    {
-        boolean change = false;
-        for (BundleStatus o : status)
-        {
-            if (o.getId() != 0)
-            {
-                boolean found = false;
-
-                for (BundleStatus n : newStatus)
-                {
-                    if (o.isMatch(n))
-                    {
-                        found = true;
-                        break;
-                    }
-                }
-
-                if (!found)
-                {
-                    change = true;
-                    uninstall(o.getId());
-                }
-            }
-        }
-        return change;
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Main.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Main.java
deleted file mode 100644
index 34572f5..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Main.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime;
-
-import static org.apache.felix.sigil.common.runtime.Runtime.ADDRESS_PROPERTY;
-import static org.apache.felix.sigil.common.runtime.Runtime.PORT_PROPERTY;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.runtime.cli.CommandLine;
-import org.apache.felix.sigil.common.runtime.cli.HelpFormatter;
-import org.apache.felix.sigil.common.runtime.cli.Options;
-import org.apache.felix.sigil.common.runtime.cli.ParseException;
-import org.apache.felix.sigil.common.runtime.cli.Parser;
-import org.apache.felix.sigil.common.runtime.cli.PosixParser;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.launch.Framework;
-import org.osgi.framework.launch.FrameworkFactory;
-
-public class Main
-{
-    private static final String COMMAND_LINE_SYNTAX = "java -jar org.apache.felix.sigil.common.runtime";
-
-    private static Framework framework;
-    private static final Options options;
-
-    private static boolean verbose = false;
-
-    static
-    {
-        options = new Options();
-        options.addOption("?", "help", false, "Print help for the Sigil launcher");
-        options.addOption("p", "port", true,
-            "Port to launch server on (0 implies auto allocate) [default 0]");
-        options.addOption("a", "address", true, "Address to bind server to [default all]");
-        options.addOption("c", "clean", false, "Clean bundle cache directory on init");
-        options.addOption("s", "startLevel", true, "Start level for framework");
-        options.addOption("v", "verbose", false, "Verbose output");
-    }
-
-    public static void main(String[] args) throws Exception
-    {
-        FrameworkFactory factory = getFrameworkFactory();
-
-        try
-        {
-            Parser parser = new PosixParser();
-            CommandLine cl = parser.parse(options, args);
-
-            if (cl.hasOption('?'))
-            {
-                printHelp();
-            }
-            else
-            {
-                verbose = cl.hasOption('v');
-
-                Map<String, String> config = buildConfig(cl);
-
-                framework = factory.newFramework(config);
-                framework.init();
-                framework.start();
-
-                Server server = launch(cl);
-
-                framework.waitForStop(0);
-
-                if (server != null)
-                {
-                    server.stop();
-                }
-            }
-        }
-        catch (NoSuchElementException e)
-        {
-            System.err.println("No " + FrameworkFactory.class.getName()
-                + " found on classpath");
-            System.exit(1);
-        }
-        catch (InterruptedException e)
-        {
-            System.err.println("Interrupted prior to framework stop");
-            System.exit(1);
-        }
-        catch (ParseException e)
-        {
-            printHelp();
-            System.exit(1);
-        }
-        catch (BundleException e)
-        {
-            e.printStackTrace();
-            System.exit(1);
-        }
-        catch (IOException e)
-        {
-            e.printStackTrace();
-            System.exit(1);
-        }
-    }
-
-    /**
-     * Simple method to parse META-INF/services file for framework factory.
-     * Currently, it assumes the first non-commented line is the class name
-     * of the framework factory implementation.
-     * @return The created <tt>FrameworkFactory</tt> instance.
-     * @throws Exception if any errors occur.
-    **/
-    private static FrameworkFactory getFrameworkFactory() throws Exception
-    {
-        URL url = Main.class.getClassLoader().getResource(
-            "META-INF/services/org.osgi.framework.launch.FrameworkFactory");
-        if (url != null)
-        {
-            BufferedReader br = new BufferedReader(
-                new InputStreamReader(url.openStream()));
-            try
-            {
-                for (String s = br.readLine(); s != null; s = br.readLine())
-                {
-                    s = s.trim();
-                    // Try to load first non-empty, non-commented line.
-                    if ((s.length() > 0) && (s.charAt(0) != '#'))
-                    {
-                        return (FrameworkFactory) Class.forName(s).newInstance();
-                    }
-                }
-            }
-            finally
-            {
-                if (br != null)
-                    br.close();
-            }
-        }
-
-        throw new Exception("Could not find framework factory.");
-    }
-
-    private static Map<String, String> buildConfig(CommandLine cl)
-    {
-        HashMap<String, String> config = new HashMap<String, String>();
-        if (cl.hasOption('c'))
-            config.put("org.osgi.framework.storage.clean", "onFirstInit");
-
-        if (cl.hasOption('s'))
-            config.put("org.osgi.framework.startlevel.beginning", cl.getOptionValue('s'));
-
-        return config;
-    }
-
-    private static Server launch(CommandLine line) throws IOException
-    {
-        Server server = new Server(framework);
-        Properties props = new Properties();
-        props.put(ADDRESS_PROPERTY, line.getOptionValue('a'));
-        props.put(PORT_PROPERTY, line.getOptionValue('p'));
-        server.start(props);
-        return server;
-    }
-
-    private static void printHelp()
-    {
-        HelpFormatter f = new HelpFormatter();
-        f.printHelp(COMMAND_LINE_SYNTAX, options);
-    }
-
-    public static void log(String msg)
-    {
-        if (verbose)
-            System.out.println(msg);
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Runtime.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Runtime.java
deleted file mode 100644
index 7fbf762..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Runtime.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime;
-
-public interface Runtime
-{
-    public static final String PORT_PROPERTY = "port";
-    public static final String ADDRESS_PROPERTY = "address";
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Server.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Server.java
deleted file mode 100644
index 4ee4357..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/Server.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.Properties;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.apache.felix.sigil.common.runtime.io.Action;
-import org.apache.felix.sigil.common.runtime.io.InstallAction;
-import org.apache.felix.sigil.common.runtime.io.RefreshAction;
-import org.apache.felix.sigil.common.runtime.io.StartAction;
-import org.apache.felix.sigil.common.runtime.io.StatusAction;
-import org.apache.felix.sigil.common.runtime.io.StopAction;
-import org.apache.felix.sigil.common.runtime.io.UninstallAction;
-import org.apache.felix.sigil.common.runtime.io.UpdateAction;
-import org.osgi.framework.launch.Framework;
-
-import static org.apache.felix.sigil.common.runtime.Runtime.ADDRESS_PROPERTY;
-import static org.apache.felix.sigil.common.runtime.Runtime.PORT_PROPERTY;
-import static org.apache.felix.sigil.common.runtime.io.Constants.*;
-
-/**
- * @author dave
- *
- */
-public class Server
-{
-    private final Framework fw;
-    private Thread accept;
-    private ExecutorService read = Executors.newCachedThreadPool();
-
-    private AtomicBoolean stopped = new AtomicBoolean();
-
-    public Server(Framework fw)
-    {
-        this.fw = fw;
-    }
-
-    public void start(Properties props) throws IOException
-    {
-        final ServerSocket socket = new ServerSocket();
-
-        String v = props.getProperty(ADDRESS_PROPERTY);
-        InetAddress address = v == null ? null : InetAddress.getByName(v);
-        int port = Integer.parseInt(props.getProperty(PORT_PROPERTY, "0"));
-
-        InetSocketAddress socketAddress = new InetSocketAddress(address, port);
-        socket.bind(socketAddress);
-
-        Main.log("Started server listening on " + socket.getLocalSocketAddress() + ":"
-            + socket.getLocalPort());
-
-        accept = new Thread(new Runnable()
-        {
-            public void run()
-            {
-                while (!stopped.get())
-                {
-                    try
-                    {
-                        read.execute(new Reader(socket.accept()));
-                    }
-                    catch (IOException e)
-                    {
-                        // TODO Auto-generated catch block
-                        e.printStackTrace();
-                    }
-                }
-            }
-        });
-
-        accept.start();
-
-        Main.log("Started thread!");
-    }
-
-    public void stop()
-    {
-        stopped.set(true);
-        accept.interrupt();
-        accept = null;
-    }
-
-    public class Reader implements Runnable
-    {
-
-        private final Socket socket;
-
-        /**
-         * @param accept
-         */
-        public Reader(Socket socket)
-        {
-            this.socket = socket;
-        }
-
-        /* (non-Javadoc)
-         * @see java.lang.Runnable#run()
-         */
-        public void run()
-        {
-            Main.log("Accepted " + socket.getInetAddress() + ":" + socket.getLocalPort());
-
-            try
-            {
-                DataInputStream in = new DataInputStream(socket.getInputStream());
-                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
-
-                while (!stopped.get())
-                {
-                    int action = in.readInt();
-
-                    Action<?, ?> task = null;
-
-                    switch (action)
-                    {
-                        case INSTALL:
-                            task = new InstallAction(in, out);
-                            break;
-                        case START:
-                            task = new StartAction(in, out);
-                            break;
-                        case STOP:
-                            task = new StopAction(in, out);
-                            break;
-                        case UNINSTALL:
-                            task = new UninstallAction(in, out);
-                            break;
-                        case UPDATE:
-                            task = new UpdateAction(in, out);
-                            break;
-                        case STATUS:
-                            task = new StatusAction(in, out);
-                            break;
-                        case REFRESH:
-                            task = new RefreshAction(in, out);
-                            break;
-                    }
-
-                    if (task == null)
-                    {
-                        Main.log("Invalid action " + action);
-                    }
-                    else
-                    {
-                        task.server(fw);
-                    }
-                }
-            }
-            catch (EOFException e)
-            {
-                // fine
-            }
-            catch (IOException e)
-            {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-            finally
-            {
-                try
-                {
-                    socket.close();
-                }
-                catch (IOException e)
-                {
-                    // TODO Auto-generated catch block
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/AlreadySelectedException.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/AlreadySelectedException.java
deleted file mode 100644
index e1ce866..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/AlreadySelectedException.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.sigil.common.runtime.cli;
-
-/**
- * Thrown when more than one option in an option group
- * has been provided.
- *
- * @author John Keyes ( john at integralsource.com )
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public class AlreadySelectedException extends ParseException
-{
-    /** The option group selected. */
-    private OptionGroup group;
-
-    /** The option that triggered the exception. */
-    private Option option;
-
-    /**
-     * Construct a new <code>AlreadySelectedException</code>
-     * with the specified detail message.
-     *
-     * @param message the detail message
-     */
-    public AlreadySelectedException(String message)
-    {
-        super(message);
-    }
-
-    /**
-     * Construct a new <code>AlreadySelectedException</code>
-     * for the specified option group.
-     *
-     * @param group  the option group already selected
-     * @param option the option that triggered the exception
-     * @since 1.2
-     */
-    public AlreadySelectedException(OptionGroup group, Option option)
-    {
-        this("The option '" + option.getKey()
-            + "' was specified but an option from this group "
-            + "has already been selected: '" + group.getSelected() + "'");
-        this.group = group;
-        this.option = option;
-    }
-
-    /**
-     * Returns the option group where another option has been selected.
-     *
-     * @return the related option group
-     * @since 1.2
-     */
-    public OptionGroup getOptionGroup()
-    {
-        return group;
-    }
-
-    /**
-     * Returns the option that was added to the group and triggered the exception.
-     *
-     * @return the related option
-     * @since 1.2
-     */
-    public Option getOption()
-    {
-        return option;
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/BasicParser.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/BasicParser.java
deleted file mode 100644
index 55bf80f..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/BasicParser.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-/**
- * The class BasicParser provides a very simple implementation of
- * the {@link Parser#flatten(Options,String[],boolean) flatten} method.
- *
- * @author John Keyes (john at integralsource.com)
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public class BasicParser extends Parser
-{
-    /**
-     * <p>A simple implementation of {@link Parser}'s abstract
-     * {@link Parser#flatten(Options, String[], boolean) flatten} method.</p>
-     *
-     * <p><b>Note:</b> <code>options</code> and <code>stopAtNonOption</code>
-     * are not used in this <code>flatten</code> method.</p>
-     *
-     * @param options The command line {@link Options}
-     * @param arguments The command line arguments to be parsed
-     * @param stopAtNonOption Specifies whether to stop flattening
-     * when an non option is found.
-     * @return The <code>arguments</code> String array.
-     */
-    protected String[] flatten(Options options, String[] arguments,
-        boolean stopAtNonOption)
-    {
-        // just echo the arguments
-        return arguments;
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/CommandLine.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/CommandLine.java
deleted file mode 100644
index 912db47..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/CommandLine.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * Represents list of arguments parsed against a {@link Options} descriptor.
- *
- * <p>It allows querying of a boolean {@link #hasOption(String opt)},
- * in addition to retrieving the {@link #getOptionValue(String opt)}
- * for options requiring arguments.</p>
- *
- * <p>Additionally, any left-over or unrecognized arguments,
- * are available for further processing.</p>
- *
- * @author bob mcwhirter (bob @ werken.com)
- * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
- * @author John Keyes (john at integralsource.com)
- * @version $Revision: 735247 $, $Date: 2009-01-17 00:23:35 -0800 (Sat, 17 Jan 2009) $
- */
-public class CommandLine implements Serializable
-{
-    private static final long serialVersionUID = 1L;
-
-    /** the unrecognised options/arguments */
-    private List args = new LinkedList();
-
-    /** the processed options */
-    private List options = new ArrayList();
-
-    /**
-     * Creates a command line.
-     */
-    CommandLine()
-    {
-        // nothing to do
-    }
-
-    /** 
-     * Query to see if an option has been set.
-     *
-     * @param opt Short name of the option
-     * @return true if set, false if not
-     */
-    public boolean hasOption(String opt)
-    {
-        return options.contains(resolveOption(opt));
-    }
-
-    /** 
-     * Query to see if an option has been set.
-     *
-     * @param opt character name of the option
-     * @return true if set, false if not
-     */
-    public boolean hasOption(char opt)
-    {
-        return hasOption(String.valueOf(opt));
-    }
-
-    /**
-     * Return the <code>Object</code> type of this <code>Option</code>.
-     *
-     * @param opt the name of the option
-     * @return the type of this <code>Option</code>
-     * @deprecated due to System.err message. Instead use getParsedOptionValue(String)
-     */
-    public Object getOptionObject(String opt)
-    {
-        try
-        {
-            return getParsedOptionValue(opt);
-        }
-        catch (ParseException pe)
-        {
-            System.err.println("Exception found converting " + opt + " to desired type: "
-                + pe.getMessage());
-            return null;
-        }
-    }
-
-    /**
-     * Return a version of this <code>Option</code> converted to a particular type. 
-     *
-     * @param opt the name of the option
-     * @return the value parsed into a particluar object
-     * @throws ParseException if there are problems turning the option value into the desired type
-     * @see PatternOptionBuilder
-     */
-    public Object getParsedOptionValue(String opt) throws ParseException
-    {
-        String res = getOptionValue(opt);
-
-        Option option = resolveOption(opt);
-        if (option == null)
-        {
-            return null;
-        }
-
-        Object type = option.getType();
-
-        return (res == null) ? null : TypeHandler.createValue(res, type);
-    }
-
-    /**
-     * Return the <code>Object</code> type of this <code>Option</code>.
-     *
-     * @param opt the name of the option
-     * @return the type of opt
-     */
-    public Object getOptionObject(char opt)
-    {
-        return getOptionObject(String.valueOf(opt));
-    }
-
-    /** 
-     * Retrieve the argument, if any, of this option.
-     *
-     * @param opt the name of the option
-     * @return Value of the argument if option is set, and has an argument,
-     * otherwise null.
-     */
-    public String getOptionValue(String opt)
-    {
-        String[] values = getOptionValues(opt);
-
-        return (values == null) ? null : values[0];
-    }
-
-    /** 
-     * Retrieve the argument, if any, of this option.
-     *
-     * @param opt the character name of the option
-     * @return Value of the argument if option is set, and has an argument,
-     * otherwise null.
-     */
-    public String getOptionValue(char opt)
-    {
-        return getOptionValue(String.valueOf(opt));
-    }
-
-    /** 
-     * Retrieves the array of values, if any, of an option.
-     *
-     * @param opt string name of the option
-     * @return Values of the argument if option is set, and has an argument,
-     * otherwise null.
-     */
-    public String[] getOptionValues(String opt)
-    {
-        List values = new ArrayList();
-
-        for (Iterator it = options.iterator(); it.hasNext();)
-        {
-            Option option = (Option) it.next();
-            if (opt.equals(option.getOpt()) || opt.equals(option.getLongOpt()))
-            {
-                values.addAll(option.getValuesList());
-            }
-        }
-
-        return values.isEmpty() ? null
-            : (String[]) values.toArray(new String[values.size()]);
-    }
-
-    /**
-     * Retrieves the option object given the long or short option as a String
-     * 
-     * @param opt short or long name of the option
-     * @return Canonicalized option
-     */
-    private Option resolveOption(String opt)
-    {
-        opt = Util.stripLeadingHyphens(opt);
-        for (Iterator it = options.iterator(); it.hasNext();)
-        {
-            Option option = (Option) it.next();
-            if (opt.equals(option.getOpt()))
-            {
-                return option;
-            }
-
-            if (opt.equals(option.getLongOpt()))
-            {
-                return option;
-            }
-
-        }
-        return null;
-    }
-
-    /** 
-     * Retrieves the array of values, if any, of an option.
-     *
-     * @param opt character name of the option
-     * @return Values of the argument if option is set, and has an argument,
-     * otherwise null.
-     */
-    public String[] getOptionValues(char opt)
-    {
-        return getOptionValues(String.valueOf(opt));
-    }
-
-    /** 
-     * Retrieve the argument, if any, of an option.
-     *
-     * @param opt name of the option
-     * @param defaultValue is the default value to be returned if the option
-     * is not specified
-     * @return Value of the argument if option is set, and has an argument,
-     * otherwise <code>defaultValue</code>.
-     */
-    public String getOptionValue(String opt, String defaultValue)
-    {
-        String answer = getOptionValue(opt);
-
-        return (answer != null) ? answer : defaultValue;
-    }
-
-    /** 
-     * Retrieve the argument, if any, of an option.
-     *
-     * @param opt character name of the option
-     * @param defaultValue is the default value to be returned if the option
-     * is not specified
-     * @return Value of the argument if option is set, and has an argument,
-     * otherwise <code>defaultValue</code>.
-     */
-    public String getOptionValue(char opt, String defaultValue)
-    {
-        return getOptionValue(String.valueOf(opt), defaultValue);
-    }
-
-    /**
-     * Retrieve the map of values associated to the option. This is convenient
-     * for options specifying Java properties like <tt>-Dparam1=value1
-     * -Dparam2=value2</tt>. The first argument of the option is the key, and
-     * the 2nd argument is the value. If the option has only one argument
-     * (<tt>-Dfoo</tt>) it is considered as a boolean flag and the value is
-     * <tt>"true"</tt>.
-     *
-     * @param opt name of the option
-     * @return The Properties mapped by the option, never <tt>null</tt>
-     *         even if the option doesn't exists
-     * @since 1.2
-     */
-    public Properties getOptionProperties(String opt)
-    {
-        Properties props = new Properties();
-
-        for (Iterator it = options.iterator(); it.hasNext();)
-        {
-            Option option = (Option) it.next();
-
-            if (opt.equals(option.getOpt()) || opt.equals(option.getLongOpt()))
-            {
-                List values = option.getValuesList();
-                if (values.size() >= 2)
-                {
-                    // use the first 2 arguments as the key/value pair
-                    props.put(values.get(0), values.get(1));
-                }
-                else if (values.size() == 1)
-                {
-                    // no explicit value, handle it as a boolean
-                    props.put(values.get(0), "true");
-                }
-            }
-        }
-
-        return props;
-    }
-
-    /** 
-     * Retrieve any left-over non-recognized options and arguments
-     *
-     * @return remaining items passed in but not parsed as an array
-     */
-    public String[] getArgs()
-    {
-        String[] answer = new String[args.size()];
-
-        args.toArray(answer);
-
-        return answer;
-    }
-
-    /** 
-     * Retrieve any left-over non-recognized options and arguments
-     *
-     * @return remaining items passed in but not parsed as a <code>List</code>.
-     */
-    public List getArgList()
-    {
-        return args;
-    }
-
-    /** 
-     * jkeyes
-     * - commented out until it is implemented properly
-     * <p>Dump state, suitable for debugging.</p>
-     *
-     * @return Stringified form of this object
-     */
-
-    /*
-    public String toString() {
-        StringBuffer buf = new StringBuffer();
-            
-        buf.append("[ CommandLine: [ options: ");
-        buf.append(options.toString());
-        buf.append(" ] [ args: ");
-        buf.append(args.toString());
-        buf.append(" ] ]");
-            
-        return buf.toString();
-    }
-    */
-
-    /**
-     * Add left-over unrecognized option/argument.
-     *
-     * @param arg the unrecognised option/argument.
-     */
-    void addArg(String arg)
-    {
-        args.add(arg);
-    }
-
-    /**
-     * Add an option to the command line.  The values of the option are stored.
-     *
-     * @param opt the processed option
-     */
-    void addOption(Option opt)
-    {
-        options.add(opt);
-    }
-
-    /**
-     * Returns an iterator over the Option members of CommandLine.
-     *
-     * @return an <code>Iterator</code> over the processed {@link Option}
-     * members of this {@link CommandLine}
-     */
-    public Iterator iterator()
-    {
-        return options.iterator();
-    }
-
-    /**
-     * Returns an array of the processed {@link Option}s.
-     *
-     * @return an array of the processed {@link Option}s.
-     */
-    public Option[] getOptions()
-    {
-        Collection processed = options;
-
-        // reinitialise array
-        Option[] optionsArray = new Option[processed.size()];
-
-        // return the array
-        return (Option[]) processed.toArray(optionsArray);
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/CommandLineParser.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/CommandLineParser.java
deleted file mode 100644
index cdfa8c2..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/CommandLineParser.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-/**
- * A class that implements the <code>CommandLineParser</code> interface
- * can parse a String array according to the {@link Options} specified
- * and return a {@link CommandLine}.
- *
- * @author John Keyes (john at integralsource.com)
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public interface CommandLineParser
-{
-    /**
-     * Parse the arguments according to the specified options.
-     *
-     * @param options the specified Options
-     * @param arguments the command line arguments
-     * @return the list of atomic option and value tokens
-     *
-     * @throws ParseException if there are any problems encountered
-     * while parsing the command line tokens.
-     */
-    CommandLine parse(Options options, String[] arguments) throws ParseException;
-
-    /**
-     * Parse the arguments according to the specified options and
-     * properties.
-     *
-     * @param options the specified Options
-     * @param arguments the command line arguments
-     * @param properties command line option name-value pairs
-     * @return the list of atomic option and value tokens
-     *
-     * @throws ParseException if there are any problems encountered
-     * while parsing the command line tokens.
-     */
-    /* To maintain binary compatibility, this is commented out.
-       It is still in the abstract Parser class, so most users will
-       still reap the benefit.
-    CommandLine parse(Options options, String[] arguments, Properties properties)
-               throws ParseException;
-     */
-
-    /**
-     * Parse the arguments according to the specified options.
-     *
-     * @param options the specified Options
-     * @param arguments the command line arguments
-     * @param stopAtNonOption specifies whether to continue parsing the
-     * arguments if a non option is encountered.
-     *
-     * @return the list of atomic option and value tokens
-     * @throws ParseException if there are any problems encountered
-     * while parsing the command line tokens.
-     */
-    CommandLine parse(Options options, String[] arguments, boolean stopAtNonOption)
-        throws ParseException;
-
-    /**
-     * Parse the arguments according to the specified options and
-     * properties.
-     *
-     * @param options the specified Options
-     * @param arguments the command line arguments
-     * @param properties command line option name-value pairs
-     * @param stopAtNonOption specifies whether to continue parsing the
-     *
-     * @return the list of atomic option and value tokens
-     * @throws ParseException if there are any problems encountered
-     * while parsing the command line tokens.
-     */
-    /* To maintain binary compatibility, this is commented out.
-       It is still in the abstract Parser class, so most users will
-       still reap the benefit.
-    CommandLine parse(Options options, String[] arguments, Properties properties, boolean stopAtNonOption)
-            throws ParseException;
-     */
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/GnuParser.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/GnuParser.java
deleted file mode 100644
index e130aa9..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/GnuParser.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The class GnuParser provides an implementation of the
- * {@link Parser#flatten(Options, String[], boolean) flatten} method.
- *
- * @author John Keyes (john at integralsource.com)
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public class GnuParser extends Parser
-{
-    /**
-     * This flatten method does so using the following rules:
-     * <ol>
-     *   <li>If an {@link Option} exists for the first character of
-     *   the <code>arguments</code> entry <b>AND</b> an {@link Option}
-     *   does not exist for the whole <code>argument</code> then
-     *   add the first character as an option to the processed tokens
-     *   list e.g. "-D" and add the rest of the entry to the also.</li>
-     *   <li>Otherwise just add the token to the processed tokens list.</li>
-     * </ol>
-     *
-     * @param options         The Options to parse the arguments by.
-     * @param arguments       The arguments that have to be flattened.
-     * @param stopAtNonOption specifies whether to stop flattening when
-     *                        a non option has been encountered
-     * @return a String array of the flattened arguments
-     */
-    protected String[] flatten(Options options, String[] arguments,
-        boolean stopAtNonOption)
-    {
-        List tokens = new ArrayList();
-
-        boolean eatTheRest = false;
-
-        for (int i = 0; i < arguments.length; i++)
-        {
-            String arg = arguments[i];
-
-            if ("--".equals(arg))
-            {
-                eatTheRest = true;
-                tokens.add("--");
-            }
-            else if ("-".equals(arg))
-            {
-                tokens.add("-");
-            }
-            else if (arg.startsWith("-"))
-            {
-                String opt = Util.stripLeadingHyphens(arg);
-
-                if (options.hasOption(opt))
-                {
-                    tokens.add(arg);
-                }
-                else
-                {
-                    if (opt.indexOf('=') != -1
-                        && options.hasOption(opt.substring(0, opt.indexOf('='))))
-                    {
-                        // the format is --foo=value or -foo=value
-                        tokens.add(arg.substring(0, arg.indexOf('='))); // --foo
-                        tokens.add(arg.substring(arg.indexOf('=') + 1)); // value
-                    }
-                    else if (options.hasOption(arg.substring(0, 2)))
-                    {
-                        // the format is a special properties option (-Dproperty=value)
-                        tokens.add(arg.substring(0, 2)); // -D
-                        tokens.add(arg.substring(2)); // property=value
-                    }
-                    else
-                    {
-                        eatTheRest = stopAtNonOption;
-                        tokens.add(arg);
-                    }
-                }
-            }
-            else
-            {
-                tokens.add(arg);
-            }
-
-            if (eatTheRest)
-            {
-                for (i++; i < arguments.length; i++)
-                {
-                    tokens.add(arguments[i]);
-                }
-            }
-        }
-
-        return (String[]) tokens.toArray(new String[tokens.size()]);
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/HelpFormatter.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/HelpFormatter.java
deleted file mode 100644
index bb0cc2e..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/HelpFormatter.java
+++ /dev/null
@@ -1,988 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-/** 
- * A formatter of help messages for the current command line options
- *
- * @author Slawek Zachcial
- * @author John Keyes (john at integralsource.com)
- * @version $Revision: 751120 $, $Date: 2009-03-06 14:45:57 -0800 (Fri, 06 Mar 2009) $
- */
-public class HelpFormatter
-{
-    // --------------------------------------------------------------- Constants
-
-    /** default number of characters per line */
-    public static final int DEFAULT_WIDTH = 74;
-
-    /** default padding to the left of each line */
-    public static final int DEFAULT_LEFT_PAD = 1;
-
-    /**
-     * the number of characters of padding to be prefixed
-     * to each description line
-     */
-    public static final int DEFAULT_DESC_PAD = 3;
-
-    /** the string to display at the beginning of the usage statement */
-    public static final String DEFAULT_SYNTAX_PREFIX = "usage: ";
-
-    /** default prefix for shortOpts */
-    public static final String DEFAULT_OPT_PREFIX = "-";
-
-    /** default prefix for long Option */
-    public static final String DEFAULT_LONG_OPT_PREFIX = "--";
-
-    /** default name for an argument */
-    public static final String DEFAULT_ARG_NAME = "arg";
-
-    // -------------------------------------------------------------- Attributes
-
-    /**
-     * number of characters per line
-     *
-     * @deprecated Scope will be made private for next major version
-     * - use get/setWidth methods instead.
-     */
-    public int defaultWidth = DEFAULT_WIDTH;
-
-    /**
-     * amount of padding to the left of each line
-     *
-     * @deprecated Scope will be made private for next major version
-     * - use get/setLeftPadding methods instead.
-     */
-    public int defaultLeftPad = DEFAULT_LEFT_PAD;
-
-    /**
-     * the number of characters of padding to be prefixed
-     * to each description line
-     *
-     * @deprecated Scope will be made private for next major version
-     * - use get/setDescPadding methods instead.
-     */
-    public int defaultDescPad = DEFAULT_DESC_PAD;
-
-    /**
-     * the string to display at the begining of the usage statement
-     *
-     * @deprecated Scope will be made private for next major version
-     * - use get/setSyntaxPrefix methods instead.
-     */
-    public String defaultSyntaxPrefix = DEFAULT_SYNTAX_PREFIX;
-
-    /**
-     * the new line string
-     *
-     * @deprecated Scope will be made private for next major version
-     * - use get/setNewLine methods instead.
-     */
-    public String defaultNewLine = System.getProperty("line.separator");
-
-    /**
-     * the shortOpt prefix
-     *
-     * @deprecated Scope will be made private for next major version
-     * - use get/setOptPrefix methods instead.
-     */
-    public String defaultOptPrefix = DEFAULT_OPT_PREFIX;
-
-    /**
-     * the long Opt prefix
-     *
-     * @deprecated Scope will be made private for next major version
-     * - use get/setLongOptPrefix methods instead.
-     */
-    public String defaultLongOptPrefix = DEFAULT_LONG_OPT_PREFIX;
-
-    /**
-     * the name of the argument
-     *
-     * @deprecated Scope will be made private for next major version
-     * - use get/setArgName methods instead.
-     */
-    public String defaultArgName = DEFAULT_ARG_NAME;
-
-    /**
-     * Comparator used to sort the options when they output in help text
-     * 
-     * Defaults to case-insensitive alphabetical sorting by option key
-     */
-    protected Comparator optionComparator = new OptionComparator();
-
-    /**
-     * Sets the 'width'.
-     *
-     * @param width the new value of 'width'
-     */
-    public void setWidth(int width)
-    {
-        this.defaultWidth = width;
-    }
-
-    /**
-     * Returns the 'width'.
-     *
-     * @return the 'width'
-     */
-    public int getWidth()
-    {
-        return defaultWidth;
-    }
-
-    /**
-     * Sets the 'leftPadding'.
-     *
-     * @param padding the new value of 'leftPadding'
-     */
-    public void setLeftPadding(int padding)
-    {
-        this.defaultLeftPad = padding;
-    }
-
-    /**
-     * Returns the 'leftPadding'.
-     *
-     * @return the 'leftPadding'
-     */
-    public int getLeftPadding()
-    {
-        return defaultLeftPad;
-    }
-
-    /**
-     * Sets the 'descPadding'.
-     *
-     * @param padding the new value of 'descPadding'
-     */
-    public void setDescPadding(int padding)
-    {
-        this.defaultDescPad = padding;
-    }
-
-    /**
-     * Returns the 'descPadding'.
-     *
-     * @return the 'descPadding'
-     */
-    public int getDescPadding()
-    {
-        return defaultDescPad;
-    }
-
-    /**
-     * Sets the 'syntaxPrefix'.
-     *
-     * @param prefix the new value of 'syntaxPrefix'
-     */
-    public void setSyntaxPrefix(String prefix)
-    {
-        this.defaultSyntaxPrefix = prefix;
-    }
-
-    /**
-     * Returns the 'syntaxPrefix'.
-     *
-     * @return the 'syntaxPrefix'
-     */
-    public String getSyntaxPrefix()
-    {
-        return defaultSyntaxPrefix;
-    }
-
-    /**
-     * Sets the 'newLine'.
-     *
-     * @param newline the new value of 'newLine'
-     */
-    public void setNewLine(String newline)
-    {
-        this.defaultNewLine = newline;
-    }
-
-    /**
-     * Returns the 'newLine'.
-     *
-     * @return the 'newLine'
-     */
-    public String getNewLine()
-    {
-        return defaultNewLine;
-    }
-
-    /**
-     * Sets the 'optPrefix'.
-     *
-     * @param prefix the new value of 'optPrefix'
-     */
-    public void setOptPrefix(String prefix)
-    {
-        this.defaultOptPrefix = prefix;
-    }
-
-    /**
-     * Returns the 'optPrefix'.
-     *
-     * @return the 'optPrefix'
-     */
-    public String getOptPrefix()
-    {
-        return defaultOptPrefix;
-    }
-
-    /**
-     * Sets the 'longOptPrefix'.
-     *
-     * @param prefix the new value of 'longOptPrefix'
-     */
-    public void setLongOptPrefix(String prefix)
-    {
-        this.defaultLongOptPrefix = prefix;
-    }
-
-    /**
-     * Returns the 'longOptPrefix'.
-     *
-     * @return the 'longOptPrefix'
-     */
-    public String getLongOptPrefix()
-    {
-        return defaultLongOptPrefix;
-    }
-
-    /**
-     * Sets the 'argName'.
-     *
-     * @param name the new value of 'argName'
-     */
-    public void setArgName(String name)
-    {
-        this.defaultArgName = name;
-    }
-
-    /**
-     * Returns the 'argName'.
-     *
-     * @return the 'argName'
-     */
-    public String getArgName()
-    {
-        return defaultArgName;
-    }
-
-    /**
-     * Comparator used to sort the options when they output in help text
-     * 
-     * Defaults to case-insensitive alphabetical sorting by option key
-     */
-    public Comparator getOptionComparator()
-    {
-        return optionComparator;
-    }
-
-    /**
-     * Set the comparator used to sort the options when they output in help text
-     * 
-     * Passing in a null parameter will set the ordering to the default mode
-     */
-    public void setOptionComparator(Comparator comparator)
-    {
-        if (comparator == null)
-        {
-            this.optionComparator = new OptionComparator();
-        }
-        else
-        {
-            this.optionComparator = comparator;
-        }
-    }
-
-    /**
-     * Print the help for <code>options</code> with the specified
-     * command line syntax.  This method prints help information to
-     * System.out.
-     *
-     * @param cmdLineSyntax the syntax for this application
-     * @param options the Options instance
-     */
-    public void printHelp(String cmdLineSyntax, Options options)
-    {
-        printHelp(defaultWidth, cmdLineSyntax, null, options, null, false);
-    }
-
-    /**
-     * Print the help for <code>options</code> with the specified
-     * command line syntax.  This method prints help information to 
-     * System.out.
-     *
-     * @param cmdLineSyntax the syntax for this application
-     * @param options the Options instance
-     * @param autoUsage whether to print an automatically generated
-     * usage statement
-     */
-    public void printHelp(String cmdLineSyntax, Options options, boolean autoUsage)
-    {
-        printHelp(defaultWidth, cmdLineSyntax, null, options, null, autoUsage);
-    }
-
-    /**
-     * Print the help for <code>options</code> with the specified
-     * command line syntax.  This method prints help information to
-     * System.out.
-     *
-     * @param cmdLineSyntax the syntax for this application
-     * @param header the banner to display at the begining of the help
-     * @param options the Options instance
-     * @param footer the banner to display at the end of the help
-     */
-    public void printHelp(String cmdLineSyntax, String header, Options options,
-        String footer)
-    {
-        printHelp(cmdLineSyntax, header, options, footer, false);
-    }
-
-    /**
-     * Print the help for <code>options</code> with the specified
-     * command line syntax.  This method prints help information to 
-     * System.out.
-     *
-     * @param cmdLineSyntax the syntax for this application
-     * @param header the banner to display at the begining of the help
-     * @param options the Options instance
-     * @param footer the banner to display at the end of the help
-     * @param autoUsage whether to print an automatically generated
-     * usage statement
-     */
-    public void printHelp(String cmdLineSyntax, String header, Options options,
-        String footer, boolean autoUsage)
-    {
-        printHelp(defaultWidth, cmdLineSyntax, header, options, footer, autoUsage);
-    }
-
-    /**
-     * Print the help for <code>options</code> with the specified
-     * command line syntax.  This method prints help information to
-     * System.out.
-     *
-     * @param width the number of characters to be displayed on each line
-     * @param cmdLineSyntax the syntax for this application
-     * @param header the banner to display at the beginning of the help
-     * @param options the Options instance
-     * @param footer the banner to display at the end of the help
-     */
-    public void printHelp(int width, String cmdLineSyntax, String header,
-        Options options, String footer)
-    {
-        printHelp(width, cmdLineSyntax, header, options, footer, false);
-    }
-
-    /**
-     * Print the help for <code>options</code> with the specified
-     * command line syntax.  This method prints help information to
-     * System.out.
-     *
-     * @param width the number of characters to be displayed on each line
-     * @param cmdLineSyntax the syntax for this application
-     * @param header the banner to display at the begining of the help
-     * @param options the Options instance
-     * @param footer the banner to display at the end of the help
-     * @param autoUsage whether to print an automatically generated 
-     * usage statement
-     */
-    public void printHelp(int width, String cmdLineSyntax, String header,
-        Options options, String footer, boolean autoUsage)
-    {
-        PrintWriter pw = new PrintWriter(System.out);
-
-        printHelp(pw, width, cmdLineSyntax, header, options, defaultLeftPad,
-            defaultDescPad, footer, autoUsage);
-        pw.flush();
-    }
-
-    /**
-     * Print the help for <code>options</code> with the specified
-     * command line syntax.
-     *
-     * @param pw the writer to which the help will be written
-     * @param width the number of characters to be displayed on each line
-     * @param cmdLineSyntax the syntax for this application
-     * @param header the banner to display at the begining of the help
-     * @param options the Options instance
-     * @param leftPad the number of characters of padding to be prefixed
-     * to each line
-     * @param descPad the number of characters of padding to be prefixed
-     * to each description line
-     * @param footer the banner to display at the end of the help
-     *
-     * @throws IllegalStateException if there is no room to print a line
-     */
-    public void printHelp(PrintWriter pw, int width, String cmdLineSyntax, String header,
-        Options options, int leftPad, int descPad, String footer)
-    {
-        printHelp(pw, width, cmdLineSyntax, header, options, leftPad, descPad, footer,
-            false);
-    }
-
-    /**
-     * Print the help for <code>options</code> with the specified
-     * command line syntax.
-     *
-     * @param pw the writer to which the help will be written
-     * @param width the number of characters to be displayed on each line
-     * @param cmdLineSyntax the syntax for this application
-     * @param header the banner to display at the begining of the help
-     * @param options the Options instance
-     * @param leftPad the number of characters of padding to be prefixed
-     * to each line
-     * @param descPad the number of characters of padding to be prefixed
-     * to each description line
-     * @param footer the banner to display at the end of the help
-     * @param autoUsage whether to print an automatically generated
-     * usage statement
-     *
-     * @throws IllegalStateException if there is no room to print a line
-     */
-    public void printHelp(PrintWriter pw, int width, String cmdLineSyntax, String header,
-        Options options, int leftPad, int descPad, String footer, boolean autoUsage)
-    {
-        if ((cmdLineSyntax == null) || (cmdLineSyntax.length() == 0))
-        {
-            throw new IllegalArgumentException("cmdLineSyntax not provided");
-        }
-
-        if (autoUsage)
-        {
-            printUsage(pw, width, cmdLineSyntax, options);
-        }
-        else
-        {
-            printUsage(pw, width, cmdLineSyntax);
-        }
-
-        if ((header != null) && (header.trim().length() > 0))
-        {
-            printWrapped(pw, width, header);
-        }
-
-        printOptions(pw, width, options, leftPad, descPad);
-
-        if ((footer != null) && (footer.trim().length() > 0))
-        {
-            printWrapped(pw, width, footer);
-        }
-    }
-
-    /**
-     * <p>Prints the usage statement for the specified application.</p>
-     *
-     * @param pw The PrintWriter to print the usage statement 
-     * @param width The number of characters to display per line
-     * @param app The application name
-     * @param options The command line Options
-     *
-     */
-    public void printUsage(PrintWriter pw, int width, String app, Options options)
-    {
-        // initialise the string buffer
-        StringBuffer buff = new StringBuffer(defaultSyntaxPrefix).append(app).append(" ");
-
-        // create a list for processed option groups
-        final Collection processedGroups = new ArrayList();
-
-        // temp variable
-        Option option;
-
-        List optList = new ArrayList(options.getOptions());
-        Collections.sort(optList, getOptionComparator());
-        // iterate over the options
-        for (Iterator i = optList.iterator(); i.hasNext();)
-        {
-            // get the next Option
-            option = (Option) i.next();
-
-            // check if the option is part of an OptionGroup
-            OptionGroup group = options.getOptionGroup(option);
-
-            // if the option is part of a group 
-            if (group != null)
-            {
-                // and if the group has not already been processed
-                if (!processedGroups.contains(group))
-                {
-                    // add the group to the processed list
-                    processedGroups.add(group);
-
-                    // add the usage clause
-                    appendOptionGroup(buff, group);
-                }
-
-                // otherwise the option was displayed in the group
-                // previously so ignore it.
-            }
-
-            // if the Option is not part of an OptionGroup
-            else
-            {
-                appendOption(buff, option, option.isRequired());
-            }
-
-            if (i.hasNext())
-            {
-                buff.append(" ");
-            }
-        }
-
-        // call printWrapped
-        printWrapped(pw, width, buff.toString().indexOf(' ') + 1, buff.toString());
-    }
-
-    /**
-     * Appends the usage clause for an OptionGroup to a StringBuffer.  
-     * The clause is wrapped in square brackets if the group is required.
-     * The display of the options is handled by appendOption
-     * @param buff the StringBuffer to append to
-     * @param group the group to append
-     * @see #appendOption(StringBuffer,Option,boolean)
-     */
-    private void appendOptionGroup(final StringBuffer buff, final OptionGroup group)
-    {
-        if (!group.isRequired())
-        {
-            buff.append("[");
-        }
-
-        List optList = new ArrayList(group.getOptions());
-        Collections.sort(optList, getOptionComparator());
-        // for each option in the OptionGroup
-        for (Iterator i = optList.iterator(); i.hasNext();)
-        {
-            // whether the option is required or not is handled at group level
-            appendOption(buff, (Option) i.next(), true);
-
-            if (i.hasNext())
-            {
-                buff.append(" | ");
-            }
-        }
-
-        if (!group.isRequired())
-        {
-            buff.append("]");
-        }
-    }
-
-    /**
-     * Appends the usage clause for an Option to a StringBuffer.  
-     *
-     * @param buff the StringBuffer to append to
-     * @param option the Option to append
-     * @param required whether the Option is required or not
-     */
-    private static void appendOption(final StringBuffer buff, final Option option,
-        final boolean required)
-    {
-        if (!required)
-        {
-            buff.append("[");
-        }
-
-        if (option.getOpt() != null)
-        {
-            buff.append("-").append(option.getOpt());
-        }
-        else
-        {
-            buff.append("--").append(option.getLongOpt());
-        }
-
-        // if the Option has a value
-        if (option.hasArg() && option.hasArgName())
-        {
-            buff.append(" <").append(option.getArgName()).append(">");
-        }
-
-        // if the Option is not a required option
-        if (!required)
-        {
-            buff.append("]");
-        }
-    }
-
-    /**
-     * Print the cmdLineSyntax to the specified writer, using the
-     * specified width.
-     *
-     * @param pw The printWriter to write the help to
-     * @param width The number of characters per line for the usage statement.
-     * @param cmdLineSyntax The usage statement.
-     */
-    public void printUsage(PrintWriter pw, int width, String cmdLineSyntax)
-    {
-        int argPos = cmdLineSyntax.indexOf(' ') + 1;
-
-        printWrapped(pw, width, defaultSyntaxPrefix.length() + argPos,
-            defaultSyntaxPrefix + cmdLineSyntax);
-    }
-
-    /**
-     * <p>Print the help for the specified Options to the specified writer, 
-     * using the specified width, left padding and description padding.</p>
-     *
-     * @param pw The printWriter to write the help to
-     * @param width The number of characters to display per line
-     * @param options The command line Options
-     * @param leftPad the number of characters of padding to be prefixed
-     * to each line
-     * @param descPad the number of characters of padding to be prefixed
-     * to each description line
-     */
-    public void printOptions(PrintWriter pw, int width, Options options, int leftPad,
-        int descPad)
-    {
-        StringBuffer sb = new StringBuffer();
-
-        renderOptions(sb, width, options, leftPad, descPad);
-        pw.println(sb.toString());
-    }
-
-    /**
-     * Print the specified text to the specified PrintWriter.
-     *
-     * @param pw The printWriter to write the help to
-     * @param width The number of characters to display per line
-     * @param text The text to be written to the PrintWriter
-     */
-    public void printWrapped(PrintWriter pw, int width, String text)
-    {
-        printWrapped(pw, width, 0, text);
-    }
-
-    /**
-     * Print the specified text to the specified PrintWriter.
-     *
-     * @param pw The printWriter to write the help to
-     * @param width The number of characters to display per line
-     * @param nextLineTabStop The position on the next line for the first tab.
-     * @param text The text to be written to the PrintWriter
-     */
-    public void printWrapped(PrintWriter pw, int width, int nextLineTabStop, String text)
-    {
-        StringBuffer sb = new StringBuffer(text.length());
-
-        renderWrappedText(sb, width, nextLineTabStop, text);
-        pw.println(sb.toString());
-    }
-
-    // --------------------------------------------------------------- Protected
-
-    /**
-     * Render the specified Options and return the rendered Options
-     * in a StringBuffer.
-     *
-     * @param sb The StringBuffer to place the rendered Options into.
-     * @param width The number of characters to display per line
-     * @param options The command line Options
-     * @param leftPad the number of characters of padding to be prefixed
-     * to each line
-     * @param descPad the number of characters of padding to be prefixed
-     * to each description line
-     *
-     * @return the StringBuffer with the rendered Options contents.
-     */
-    protected StringBuffer renderOptions(StringBuffer sb, int width, Options options,
-        int leftPad, int descPad)
-    {
-        final String lpad = createPadding(leftPad);
-        final String dpad = createPadding(descPad);
-
-        // first create list containing only <lpad>-a,--aaa where 
-        // -a is opt and --aaa is long opt; in parallel look for 
-        // the longest opt string this list will be then used to 
-        // sort options ascending
-        int max = 0;
-        StringBuffer optBuf;
-        List prefixList = new ArrayList();
-
-        List optList = options.helpOptions();
-
-        Collections.sort(optList, getOptionComparator());
-
-        for (Iterator i = optList.iterator(); i.hasNext();)
-        {
-            Option option = (Option) i.next();
-            optBuf = new StringBuffer(8);
-
-            if (option.getOpt() == null)
-            {
-                optBuf.append(lpad).append("   " + defaultLongOptPrefix).append(
-                    option.getLongOpt());
-            }
-            else
-            {
-                optBuf.append(lpad).append(defaultOptPrefix).append(option.getOpt());
-
-                if (option.hasLongOpt())
-                {
-                    optBuf.append(',').append(defaultLongOptPrefix).append(
-                        option.getLongOpt());
-                }
-            }
-
-            if (option.hasArg())
-            {
-                if (option.hasArgName())
-                {
-                    optBuf.append(" <").append(option.getArgName()).append(">");
-                }
-                else
-                {
-                    optBuf.append(' ');
-                }
-            }
-
-            prefixList.add(optBuf);
-            max = (optBuf.length() > max) ? optBuf.length() : max;
-        }
-
-        int x = 0;
-
-        for (Iterator i = optList.iterator(); i.hasNext();)
-        {
-            Option option = (Option) i.next();
-            optBuf = new StringBuffer(prefixList.get(x++).toString());
-
-            if (optBuf.length() < max)
-            {
-                optBuf.append(createPadding(max - optBuf.length()));
-            }
-
-            optBuf.append(dpad);
-
-            int nextLineTabStop = max + descPad;
-
-            if (option.getDescription() != null)
-            {
-                optBuf.append(option.getDescription());
-            }
-
-            renderWrappedText(sb, width, nextLineTabStop, optBuf.toString());
-
-            if (i.hasNext())
-            {
-                sb.append(defaultNewLine);
-            }
-        }
-
-        return sb;
-    }
-
-    /**
-     * Render the specified text and return the rendered Options
-     * in a StringBuffer.
-     *
-     * @param sb The StringBuffer to place the rendered text into.
-     * @param width The number of characters to display per line
-     * @param nextLineTabStop The position on the next line for the first tab.
-     * @param text The text to be rendered.
-     *
-     * @return the StringBuffer with the rendered Options contents.
-     */
-    protected StringBuffer renderWrappedText(StringBuffer sb, int width,
-        int nextLineTabStop, String text)
-    {
-        int pos = findWrapPos(text, width, 0);
-
-        if (pos == -1)
-        {
-            sb.append(rtrim(text));
-
-            return sb;
-        }
-        sb.append(rtrim(text.substring(0, pos))).append(defaultNewLine);
-
-        if (nextLineTabStop >= width)
-        {
-            // stops infinite loop happening
-            nextLineTabStop = 1;
-        }
-
-        // all following lines must be padded with nextLineTabStop space 
-        // characters
-        final String padding = createPadding(nextLineTabStop);
-
-        while (true)
-        {
-            text = padding + text.substring(pos).trim();
-            pos = findWrapPos(text, width, 0);
-
-            if (pos == -1)
-            {
-                sb.append(text);
-
-                return sb;
-            }
-
-            if ((text.length() > width) && (pos == nextLineTabStop - 1))
-            {
-                pos = width;
-            }
-
-            sb.append(rtrim(text.substring(0, pos))).append(defaultNewLine);
-        }
-    }
-
-    /**
-     * Finds the next text wrap position after <code>startPos</code> for the
-     * text in <code>text</code> with the column width <code>width</code>.
-     * The wrap point is the last postion before startPos+width having a 
-     * whitespace character (space, \n, \r).
-     *
-     * @param text The text being searched for the wrap position
-     * @param width width of the wrapped text
-     * @param startPos position from which to start the lookup whitespace
-     * character
-     * @return postion on which the text must be wrapped or -1 if the wrap
-     * position is at the end of the text
-     */
-    protected int findWrapPos(String text, int width, int startPos)
-    {
-        int pos = -1;
-
-        // the line ends before the max wrap pos or a new line char found
-        if (((pos = text.indexOf('\n', startPos)) != -1 && pos <= width)
-            || ((pos = text.indexOf('\t', startPos)) != -1 && pos <= width))
-        {
-            return pos + 1;
-        }
-        else if (startPos + width >= text.length())
-        {
-            return -1;
-        }
-
-        // look for the last whitespace character before startPos+width
-        pos = startPos + width;
-
-        char c;
-
-        while ((pos >= startPos) && ((c = text.charAt(pos)) != ' ') && (c != '\n')
-            && (c != '\r'))
-        {
-            --pos;
-        }
-
-        // if we found it - just return
-        if (pos > startPos)
-        {
-            return pos;
-        }
-
-        // must look for the first whitespace chearacter after startPos 
-        // + width
-        pos = startPos + width;
-
-        while ((pos <= text.length()) && ((c = text.charAt(pos)) != ' ') && (c != '\n')
-            && (c != '\r'))
-        {
-            ++pos;
-        }
-
-        return (pos == text.length()) ? (-1) : pos;
-    }
-
-    /**
-     * Return a String of padding of length <code>len</code>.
-     *
-     * @param len The length of the String of padding to create.
-     *
-     * @return The String of padding
-     */
-    protected String createPadding(int len)
-    {
-        StringBuffer sb = new StringBuffer(len);
-
-        for (int i = 0; i < len; ++i)
-        {
-            sb.append(' ');
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Remove the trailing whitespace from the specified String.
-     *
-     * @param s The String to remove the trailing padding from.
-     *
-     * @return The String of without the trailing padding
-     */
-    protected String rtrim(String s)
-    {
-        if ((s == null) || (s.length() == 0))
-        {
-            return s;
-        }
-
-        int pos = s.length();
-
-        while ((pos > 0) && Character.isWhitespace(s.charAt(pos - 1)))
-        {
-            --pos;
-        }
-
-        return s.substring(0, pos);
-    }
-
-    // ------------------------------------------------------ Package protected
-    // ---------------------------------------------------------------- Private
-    // ---------------------------------------------------------- Inner classes
-    /**
-     * This class implements the <code>Comparator</code> interface
-     * for comparing Options.
-     */
-    private static class OptionComparator implements Comparator
-    {
-
-        /**
-         * Compares its two arguments for order. Returns a negative
-         * integer, zero, or a positive integer as the first argument
-         * is less than, equal to, or greater than the second.
-         *
-         * @param o1 The first Option to be compared.
-         * @param o2 The second Option to be compared.
-         * @return a negative integer, zero, or a positive integer as
-         *         the first argument is less than, equal to, or greater than the
-         *         second.
-         */
-        public int compare(Object o1, Object o2)
-        {
-            Option opt1 = (Option) o1;
-            Option opt2 = (Option) o2;
-
-            return opt1.getKey().compareToIgnoreCase(opt2.getKey());
-        }
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/MissingArgumentException.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/MissingArgumentException.java
deleted file mode 100644
index 5c80081..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/MissingArgumentException.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-/**
- * Thrown when an option requiring an argument
- * is not provided with an argument.
- *
- * @author John Keyes (john at integralsource.com)
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public class MissingArgumentException extends ParseException
-{
-    /** The option requiring additional arguments */
-    private Option option;
-
-    /**
-     * Construct a new <code>MissingArgumentException</code>
-     * with the specified detail message.
-     *
-     * @param message the detail message
-     */
-    public MissingArgumentException(String message)
-    {
-        super(message);
-    }
-
-    /**
-     * Construct a new <code>MissingArgumentException</code>
-     * with the specified detail message.
-     *
-     * @param option the option requiring an argument
-     * @since 1.2
-     */
-    public MissingArgumentException(Option option)
-    {
-        this("Missing argument for option: " + option.getKey());
-        this.option = option;
-    }
-
-    /**
-     * Return the option requiring an argument that wasn't provided
-     * on the command line.
-     *
-     * @return the related option
-     * @since 1.2
-     */
-    public Option getOption()
-    {
-        return option;
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/MissingOptionException.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/MissingOptionException.java
deleted file mode 100644
index 0341d55..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/MissingOptionException.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.util.List;
-import java.util.Iterator;
-
-/**
- * Thrown when a required option has not been provided.
- *
- * @author John Keyes ( john at integralsource.com )
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public class MissingOptionException extends ParseException
-{
-    /** The list of missing options */
-    private List missingOptions;
-
-    /**
-     * Construct a new <code>MissingSelectedException</code>
-     * with the specified detail message.
-     *
-     * @param message the detail message
-     */
-    public MissingOptionException(String message)
-    {
-        super(message);
-    }
-
-    /**
-     * Constructs a new <code>MissingSelectedException</code> with the
-     * specified list of missing options.
-     *
-     * @param missingOptions the list of missing options
-     * @since 1.2
-     */
-    public MissingOptionException(List missingOptions)
-    {
-        this(createMessage(missingOptions));
-        this.missingOptions = missingOptions;
-    }
-
-    /**
-     * Return the list of options (as strings) missing in the command line parsed.
-     *
-     * @return the missing options
-     * @since 1.2
-     */
-    public List getMissingOptions()
-    {
-        return missingOptions;
-    }
-
-    /**
-     * Build the exception message from the specified list of options.
-     *
-     * @param missingOptions
-     * @since 1.2
-     */
-    private static String createMessage(List missingOptions)
-    {
-        StringBuffer buff = new StringBuffer("Missing required option");
-        buff.append(missingOptions.size() == 1 ? "" : "s");
-        buff.append(": ");
-
-        Iterator it = missingOptions.iterator();
-        while (it.hasNext())
-        {
-            buff.append(it.next());
-            if (it.hasNext())
-            {
-                buff.append(", ");
-            }
-        }
-
-        return buff.toString();
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Option.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Option.java
deleted file mode 100644
index acf66e3..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Option.java
+++ /dev/null
@@ -1,675 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-/** <p>Describes a single command-line option.  It maintains
- * information regarding the short-name of the option, the long-name,
- * if any exists, a flag indicating if an argument is required for
- * this option, and a self-documenting description of the option.</p>
- *
- * <p>An Option is not created independantly, but is create through
- * an instance of {@link Options}.<p>
- *
- * @see org.apache.commons.cli.Options
- * @see org.apache.commons.cli.CommandLine
- *
- * @author bob mcwhirter (bob @ werken.com)
- * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public class Option implements Cloneable, Serializable
-{
-    private static final long serialVersionUID = 1L;
-
-    /** constant that specifies the number of argument values has not been specified */
-    public static final int UNINITIALIZED = -1;
-
-    /** constant that specifies the number of argument values is infinite */
-    public static final int UNLIMITED_VALUES = -2;
-
-    /** the name of the option */
-    private String opt;
-
-    /** the long representation of the option */
-    private String longOpt;
-
-    /** the name of the argument for this option */
-    private String argName = "arg";
-
-    /** description of the option */
-    private String description;
-
-    /** specifies whether this option is required to be present */
-    private boolean required;
-
-    /** specifies whether the argument value of this Option is optional */
-    private boolean optionalArg;
-
-    /** the number of argument values this option can have */
-    private int numberOfArgs = UNINITIALIZED;
-
-    /** the type of this Option */
-    private Object type;
-
-    /** the list of argument values **/
-    private List values = new ArrayList();
-
-    /** the character that is the value separator */
-    private char valuesep;
-
-    /**
-     * Creates an Option using the specified parameters.
-     *
-     * @param opt short representation of the option
-     * @param description describes the function of the option
-     *
-     * @throws IllegalArgumentException if there are any non valid
-     * Option characters in <code>opt</code>.
-     */
-    public Option(String opt, String description) throws IllegalArgumentException
-    {
-        this(opt, null, false, description);
-    }
-
-    /**
-     * Creates an Option using the specified parameters.
-     *
-     * @param opt short representation of the option
-     * @param hasArg specifies whether the Option takes an argument or not
-     * @param description describes the function of the option
-     *
-     * @throws IllegalArgumentException if there are any non valid
-     * Option characters in <code>opt</code>.
-     */
-    public Option(String opt, boolean hasArg, String description) throws IllegalArgumentException
-    {
-        this(opt, null, hasArg, description);
-    }
-
-    /**
-     * Creates an Option using the specified parameters.
-     *
-     * @param opt short representation of the option
-     * @param longOpt the long representation of the option
-     * @param hasArg specifies whether the Option takes an argument or not
-     * @param description describes the function of the option
-     *
-     * @throws IllegalArgumentException if there are any non valid
-     * Option characters in <code>opt</code>.
-     */
-    public Option(String opt, String longOpt, boolean hasArg, String description) throws IllegalArgumentException
-    {
-        // ensure that the option is valid
-        OptionValidator.validateOption(opt);
-
-        this.opt = opt;
-        this.longOpt = longOpt;
-
-        // if hasArg is set then the number of arguments is 1
-        if (hasArg)
-        {
-            this.numberOfArgs = 1;
-        }
-
-        this.description = description;
-    }
-
-    /**
-     * Returns the id of this Option.  This is only set when the
-     * Option shortOpt is a single character.  This is used for switch
-     * statements.
-     *
-     * @return the id of this Option
-     */
-    public int getId()
-    {
-        return getKey().charAt(0);
-    }
-
-    /**
-     * Returns the 'unique' Option identifier.
-     * 
-     * @return the 'unique' Option identifier
-     */
-    String getKey()
-    {
-        // if 'opt' is null, then it is a 'long' option
-        if (opt == null)
-        {
-            return longOpt;
-        }
-
-        return opt;
-    }
-
-    /** 
-     * Retrieve the name of this Option.
-     *
-     * It is this String which can be used with
-     * {@link CommandLine#hasOption(String opt)} and
-     * {@link CommandLine#getOptionValue(String opt)} to check
-     * for existence and argument.
-     *
-     * @return The name of this option
-     */
-    public String getOpt()
-    {
-        return opt;
-    }
-
-    /**
-     * Retrieve the type of this Option.
-     * 
-     * @return The type of this option
-     */
-    public Object getType()
-    {
-        return type;
-    }
-
-    /**
-     * Sets the type of this Option.
-     *
-     * @param type the type of this Option
-     */
-    public void setType(Object type)
-    {
-        this.type = type;
-    }
-
-    /** 
-     * Retrieve the long name of this Option.
-     *
-     * @return Long name of this option, or null, if there is no long name
-     */
-    public String getLongOpt()
-    {
-        return longOpt;
-    }
-
-    /**
-     * Sets the long name of this Option.
-     *
-     * @param longOpt the long name of this Option
-     */
-    public void setLongOpt(String longOpt)
-    {
-        this.longOpt = longOpt;
-    }
-
-    /**
-     * Sets whether this Option can have an optional argument.
-     *
-     * @param optionalArg specifies whether the Option can have
-     * an optional argument.
-     */
-    public void setOptionalArg(boolean optionalArg)
-    {
-        this.optionalArg = optionalArg;
-    }
-
-    /**
-     * @return whether this Option can have an optional argument
-     */
-    public boolean hasOptionalArg()
-    {
-        return optionalArg;
-    }
-
-    /** 
-     * Query to see if this Option has a long name
-     *
-     * @return boolean flag indicating existence of a long name
-     */
-    public boolean hasLongOpt()
-    {
-        return longOpt != null;
-    }
-
-    /** 
-     * Query to see if this Option requires an argument
-     *
-     * @return boolean flag indicating if an argument is required
-     */
-    public boolean hasArg()
-    {
-        return numberOfArgs > 0 || numberOfArgs == UNLIMITED_VALUES;
-    }
-
-    /** 
-     * Retrieve the self-documenting description of this Option
-     *
-     * @return The string description of this option
-     */
-    public String getDescription()
-    {
-        return description;
-    }
-
-    /**
-     * Sets the self-documenting description of this Option
-     *
-     * @param description The description of this option
-     * @since 1.1
-     */
-    public void setDescription(String description)
-    {
-        this.description = description;
-    }
-
-    /** 
-     * Query to see if this Option requires an argument
-     *
-     * @return boolean flag indicating if an argument is required
-     */
-    public boolean isRequired()
-    {
-        return required;
-    }
-
-    /**
-     * Sets whether this Option is mandatory.
-     *
-     * @param required specifies whether this Option is mandatory
-     */
-    public void setRequired(boolean required)
-    {
-        this.required = required;
-    }
-
-    /**
-     * Sets the display name for the argument value.
-     *
-     * @param argName the display name for the argument value.
-     */
-    public void setArgName(String argName)
-    {
-        this.argName = argName;
-    }
-
-    /**
-     * Gets the display name for the argument value.
-     *
-     * @return the display name for the argument value.
-     */
-    public String getArgName()
-    {
-        return argName;
-    }
-
-    /**
-     * Returns whether the display name for the argument value
-     * has been set.
-     *
-     * @return if the display name for the argument value has been
-     * set.
-     */
-    public boolean hasArgName()
-    {
-        return argName != null && argName.length() > 0;
-    }
-
-    /** 
-     * Query to see if this Option can take many values.
-     *
-     * @return boolean flag indicating if multiple values are allowed
-     */
-    public boolean hasArgs()
-    {
-        return numberOfArgs > 1 || numberOfArgs == UNLIMITED_VALUES;
-    }
-
-    /** 
-     * Sets the number of argument values this Option can take.
-     *
-     * @param num the number of argument values
-     */
-    public void setArgs(int num)
-    {
-        this.numberOfArgs = num;
-    }
-
-    /**
-     * Sets the value separator.  For example if the argument value
-     * was a Java property, the value separator would be '='.
-     *
-     * @param sep The value separator.
-     */
-    public void setValueSeparator(char sep)
-    {
-        this.valuesep = sep;
-    }
-
-    /**
-     * Returns the value separator character.
-     *
-     * @return the value separator character.
-     */
-    public char getValueSeparator()
-    {
-        return valuesep;
-    }
-
-    /**
-     * Return whether this Option has specified a value separator.
-     * 
-     * @return whether this Option has specified a value separator.
-     * @since 1.1
-     */
-    public boolean hasValueSeparator()
-    {
-        return valuesep > 0;
-    }
-
-    /** 
-     * Returns the number of argument values this Option can take.
-     *
-     * @return num the number of argument values
-     */
-    public int getArgs()
-    {
-        return numberOfArgs;
-    }
-
-    /**
-     * Adds the specified value to this Option.
-     * 
-     * @param value is a/the value of this Option
-     */
-    void addValueForProcessing(String value)
-    {
-        switch (numberOfArgs)
-        {
-            case UNINITIALIZED:
-                throw new RuntimeException("NO_ARGS_ALLOWED");
-
-            default:
-                processValue(value);
-        }
-    }
-
-    /**
-     * Processes the value.  If this Option has a value separator
-     * the value will have to be parsed into individual tokens.  When
-     * n-1 tokens have been processed and there are more value separators
-     * in the value, parsing is ceased and the remaining characters are
-     * added as a single token.
-     *
-     * @param value The String to be processed.
-     *
-     * @since 1.0.1
-     */
-    private void processValue(String value)
-    {
-        // this Option has a separator character
-        if (hasValueSeparator())
-        {
-            // get the separator character
-            char sep = getValueSeparator();
-
-            // store the index for the value separator
-            int index = value.indexOf(sep);
-
-            // while there are more value separators
-            while (index != -1)
-            {
-                // next value to be added 
-                if (values.size() == (numberOfArgs - 1))
-                {
-                    break;
-                }
-
-                // store
-                add(value.substring(0, index));
-
-                // parse
-                value = value.substring(index + 1);
-
-                // get new index
-                index = value.indexOf(sep);
-            }
-        }
-
-        // store the actual value or the last value that has been parsed
-        add(value);
-    }
-
-    /**
-     * Add the value to this Option.  If the number of arguments
-     * is greater than zero and there is enough space in the list then
-     * add the value.  Otherwise, throw a runtime exception.
-     *
-     * @param value The value to be added to this Option
-     *
-     * @since 1.0.1
-     */
-    private void add(String value)
-    {
-        if ((numberOfArgs > 0) && (values.size() > (numberOfArgs - 1)))
-        {
-            throw new RuntimeException("Cannot add value, list full.");
-        }
-
-        // store value
-        values.add(value);
-    }
-
-    /**
-     * Returns the specified value of this Option or 
-     * <code>null</code> if there is no value.
-     *
-     * @return the value/first value of this Option or 
-     * <code>null</code> if there is no value.
-     */
-    public String getValue()
-    {
-        return hasNoValues() ? null : (String) values.get(0);
-    }
-
-    /**
-     * Returns the specified value of this Option or 
-     * <code>null</code> if there is no value.
-     *
-     * @param index The index of the value to be returned.
-     *
-     * @return the specified value of this Option or 
-     * <code>null</code> if there is no value.
-     *
-     * @throws IndexOutOfBoundsException if index is less than 1
-     * or greater than the number of the values for this Option.
-     */
-    public String getValue(int index) throws IndexOutOfBoundsException
-    {
-        return hasNoValues() ? null : (String) values.get(index);
-    }
-
-    /**
-     * Returns the value/first value of this Option or the 
-     * <code>defaultValue</code> if there is no value.
-     *
-     * @param defaultValue The value to be returned if ther
-     * is no value.
-     *
-     * @return the value/first value of this Option or the 
-     * <code>defaultValue</code> if there are no values.
-     */
-    public String getValue(String defaultValue)
-    {
-        String value = getValue();
-
-        return (value != null) ? value : defaultValue;
-    }
-
-    /**
-     * Return the values of this Option as a String array 
-     * or null if there are no values
-     *
-     * @return the values of this Option as a String array 
-     * or null if there are no values
-     */
-    public String[] getValues()
-    {
-        return hasNoValues() ? null
-            : (String[]) values.toArray(new String[values.size()]);
-    }
-
-    /**
-     * @return the values of this Option as a List
-     * or null if there are no values
-     */
-    public List getValuesList()
-    {
-        return values;
-    }
-
-    /** 
-     * Dump state, suitable for debugging.
-     *
-     * @return Stringified form of this object
-     */
-    public String toString()
-    {
-        StringBuffer buf = new StringBuffer().append("[ option: ");
-
-        buf.append(opt);
-
-        if (longOpt != null)
-        {
-            buf.append(" ").append(longOpt);
-        }
-
-        buf.append(" ");
-
-        if (hasArgs())
-        {
-            buf.append("[ARG...]");
-        }
-        else if (hasArg())
-        {
-            buf.append(" [ARG]");
-        }
-
-        buf.append(" :: ").append(description);
-
-        if (type != null)
-        {
-            buf.append(" :: ").append(type);
-        }
-
-        buf.append(" ]");
-
-        return buf.toString();
-    }
-
-    /**
-     * Returns whether this Option has any values.
-     *
-     * @return whether this Option has any values.
-     */
-    private boolean hasNoValues()
-    {
-        return values.isEmpty();
-    }
-
-    public boolean equals(Object o)
-    {
-        if (this == o)
-        {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass())
-        {
-            return false;
-        }
-
-        Option option = (Option) o;
-
-        if (opt != null ? !opt.equals(option.opt) : option.opt != null)
-        {
-            return false;
-        }
-        if (longOpt != null ? !longOpt.equals(option.longOpt) : option.longOpt != null)
-        {
-            return false;
-        }
-
-        return true;
-    }
-
-    public int hashCode()
-    {
-        int result;
-        result = (opt != null ? opt.hashCode() : 0);
-        result = 31 * result + (longOpt != null ? longOpt.hashCode() : 0);
-        return result;
-    }
-
-    /**
-     * A rather odd clone method - due to incorrect code in 1.0 it is public 
-     * and in 1.1 rather than throwing a CloneNotSupportedException it throws 
-     * a RuntimeException so as to maintain backwards compat at the API level. 
-     *
-     * After calling this method, it is very likely you will want to call 
-     * clearValues(). 
-     *
-     * @throws RuntimeException
-     */
-    public Object clone()
-    {
-        try
-        {
-            Option option = (Option) super.clone();
-            option.values = new ArrayList(values);
-            return option;
-        }
-        catch (CloneNotSupportedException cnse)
-        {
-            throw new RuntimeException("A CloneNotSupportedException was thrown: "
-                + cnse.getMessage());
-        }
-    }
-
-    /**
-     * Clear the Option values. After a parse is complete, these are left with
-     * data in them and they need clearing if another parse is done.
-     *
-     * See: <a href="https://issues.apache.org/jira/browse/CLI-71">CLI-71</a>
-     */
-    void clearValues()
-    {
-        values.clear();
-    }
-
-    /**
-     * This method is not intended to be used. It was a piece of internal 
-     * API that was made public in 1.0. It currently throws an UnsupportedOperationException. 
-     * @deprecated
-     * @throws UnsupportedOperationException
-     */
-    public boolean addValue(String value)
-    {
-        throw new UnsupportedOperationException(
-            "The addValue method is not intended for client use. "
-                + "Subclasses should use the addValueForProcessing method instead. ");
-    }
-
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/OptionBuilder.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/OptionBuilder.java
deleted file mode 100644
index 2deef51..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/OptionBuilder.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-/**
- * OptionBuilder allows the user to create Options using descriptive methods.
- *
- * <p>Details on the Builder pattern can be found at
- * <a href="http://c2.com/cgi-bin/wiki?BuilderPattern">
- * http://c2.com/cgi-bin/wiki?BuilderPattern</a>.</p>
- *
- * @author John Keyes (john at integralsource.com)
- * @version $Revision: 754830 $, $Date: 2009-03-16 00:26:44 -0700 (Mon, 16 Mar 2009) $
- * @since 1.0
- */
-public final class OptionBuilder
-{
-    /** long option */
-    private static String longopt;
-
-    /** option description */
-    private static String description;
-
-    /** argument name */
-    private static String argName;
-
-    /** is required? */
-    private static boolean required;
-
-    /** the number of arguments */
-    private static int numberOfArgs = Option.UNINITIALIZED;
-
-    /** option type */
-    private static Object type;
-
-    /** option can have an optional argument value */
-    private static boolean optionalArg;
-
-    /** value separator for argument value */
-    private static char valuesep;
-
-    /** option builder instance */
-    private static OptionBuilder instance = new OptionBuilder();
-
-    /**
-     * private constructor to prevent instances being created
-     */
-    private OptionBuilder()
-    {
-        // hide the constructor
-    }
-
-    /**
-     * Resets the member variables to their default values.
-     */
-    private static void reset()
-    {
-        description = null;
-        argName = "arg";
-        longopt = null;
-        type = null;
-        required = false;
-        numberOfArgs = Option.UNINITIALIZED;
-
-        // PMM 9/6/02 - these were missing
-        optionalArg = false;
-        valuesep = (char) 0;
-    }
-
-    /**
-     * The next Option created will have the following long option value.
-     *
-     * @param newLongopt the long option value
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder withLongOpt(String newLongopt)
-    {
-        OptionBuilder.longopt = newLongopt;
-
-        return instance;
-    }
-
-    /**
-     * The next Option created will require an argument value.
-     *
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder hasArg()
-    {
-        OptionBuilder.numberOfArgs = 1;
-
-        return instance;
-    }
-
-    /**
-     * The next Option created will require an argument value if
-     * <code>hasArg</code> is true.
-     *
-     * @param hasArg if true then the Option has an argument value
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder hasArg(boolean hasArg)
-    {
-        OptionBuilder.numberOfArgs = hasArg ? 1 : Option.UNINITIALIZED;
-
-        return instance;
-    }
-
-    /**
-     * The next Option created will have the specified argument value name.
-     *
-     * @param name the name for the argument value
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder withArgName(String name)
-    {
-        OptionBuilder.argName = name;
-
-        return instance;
-    }
-
-    /**
-     * The next Option created will be required.
-     *
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder isRequired()
-    {
-        OptionBuilder.required = true;
-
-        return instance;
-    }
-
-    /**
-     * The next Option created uses <code>sep</code> as a means to
-     * separate argument values.
-     *
-     * <b>Example:</b>
-     * <pre>
-     * Option opt = OptionBuilder.withValueSeparator(':')
-     *                           .create('D');
-     *
-     * CommandLine line = parser.parse(args);
-     * String propertyName = opt.getValue(0);
-     * String propertyValue = opt.getValue(1);
-     * </pre>
-     *
-     * @param sep The value separator to be used for the argument values.
-     *
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder withValueSeparator(char sep)
-    {
-        OptionBuilder.valuesep = sep;
-
-        return instance;
-    }
-
-    /**
-     * The next Option created uses '<code>=</code>' as a means to
-     * separate argument values.
-     *
-     * <b>Example:</b>
-     * <pre>
-     * Option opt = OptionBuilder.withValueSeparator()
-     *                           .create('D');
-     *
-     * CommandLine line = parser.parse(args);
-     * String propertyName = opt.getValue(0);
-     * String propertyValue = opt.getValue(1);
-     * </pre>
-     *
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder withValueSeparator()
-    {
-        OptionBuilder.valuesep = '=';
-
-        return instance;
-    }
-
-    /**
-     * The next Option created will be required if <code>required</code>
-     * is true.
-     *
-     * @param newRequired if true then the Option is required
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder isRequired(boolean newRequired)
-    {
-        OptionBuilder.required = newRequired;
-
-        return instance;
-    }
-
-    /**
-     * The next Option created can have unlimited argument values.
-     *
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder hasArgs()
-    {
-        OptionBuilder.numberOfArgs = Option.UNLIMITED_VALUES;
-
-        return instance;
-    }
-
-    /**
-     * The next Option created can have <code>num</code> argument values.
-     *
-     * @param num the number of args that the option can have
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder hasArgs(int num)
-    {
-        OptionBuilder.numberOfArgs = num;
-
-        return instance;
-    }
-
-    /**
-     * The next Option can have an optional argument.
-     *
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder hasOptionalArg()
-    {
-        OptionBuilder.numberOfArgs = 1;
-        OptionBuilder.optionalArg = true;
-
-        return instance;
-    }
-
-    /**
-     * The next Option can have an unlimited number of optional arguments.
-     *
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder hasOptionalArgs()
-    {
-        OptionBuilder.numberOfArgs = Option.UNLIMITED_VALUES;
-        OptionBuilder.optionalArg = true;
-
-        return instance;
-    }
-
-    /**
-     * The next Option can have the specified number of optional arguments.
-     *
-     * @param numArgs - the maximum number of optional arguments
-     * the next Option created can have.
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder hasOptionalArgs(int numArgs)
-    {
-        OptionBuilder.numberOfArgs = numArgs;
-        OptionBuilder.optionalArg = true;
-
-        return instance;
-    }
-
-    /**
-     * The next Option created will have a value that will be an instance
-     * of <code>type</code>.
-     *
-     * @param newType the type of the Options argument value
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder withType(Object newType)
-    {
-        OptionBuilder.type = newType;
-
-        return instance;
-    }
-
-    /**
-     * The next Option created will have the specified description
-     *
-     * @param newDescription a description of the Option's purpose
-     * @return the OptionBuilder instance
-     */
-    public static OptionBuilder withDescription(String newDescription)
-    {
-        OptionBuilder.description = newDescription;
-
-        return instance;
-    }
-
-    /**
-     * Create an Option using the current settings and with
-     * the specified Option <code>char</code>.
-     *
-     * @param opt the character representation of the Option
-     * @return the Option instance
-     * @throws IllegalArgumentException if <code>opt</code> is not
-     * a valid character.  See Option.
-     */
-    public static Option create(char opt) throws IllegalArgumentException
-    {
-        return create(String.valueOf(opt));
-    }
-
-    /**
-     * Create an Option using the current settings
-     *
-     * @return the Option instance
-     * @throws IllegalArgumentException if <code>longOpt</code> has not been set.
-     */
-    public static Option create() throws IllegalArgumentException
-    {
-        if (longopt == null)
-        {
-            OptionBuilder.reset();
-            throw new IllegalArgumentException("must specify longopt");
-        }
-
-        return create(null);
-    }
-
-    /**
-     * Create an Option using the current settings and with
-     * the specified Option <code>char</code>.
-     *
-     * @param opt the <code>java.lang.String</code> representation
-     * of the Option
-     * @return the Option instance
-     * @throws IllegalArgumentException if <code>opt</code> is not
-     * a valid character.  See Option.
-     */
-    public static Option create(String opt) throws IllegalArgumentException
-    {
-        Option option = null;
-        try
-        {
-            // create the option
-            option = new Option(opt, description);
-
-            // set the option properties
-            option.setLongOpt(longopt);
-            option.setRequired(required);
-            option.setOptionalArg(optionalArg);
-            option.setArgs(numberOfArgs);
-            option.setType(type);
-            option.setValueSeparator(valuesep);
-            option.setArgName(argName);
-        }
-        finally
-        {
-            // reset the OptionBuilder properties
-            OptionBuilder.reset();
-        }
-
-        // return the Option instance
-        return option;
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/OptionGroup.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/OptionGroup.java
deleted file mode 100644
index e9deeb2..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/OptionGroup.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * A group of mutually exclusive options.
- *
- * @author John Keyes ( john at integralsource.com )
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public class OptionGroup implements Serializable
-{
-    private static final long serialVersionUID = 1L;
-
-    /** hold the options */
-    private Map optionMap = new HashMap();
-
-    /** the name of the selected option */
-    private String selected;
-
-    /** specified whether this group is required */
-    private boolean required;
-
-    /**
-     * Add the specified <code>Option</code> to this group.
-     *
-     * @param option the option to add to this group
-     * @return this option group with the option added
-     */
-    public OptionGroup addOption(Option option)
-    {
-        // key   - option name
-        // value - the option
-        optionMap.put(option.getKey(), option);
-
-        return this;
-    }
-
-    /**
-     * @return the names of the options in this group as a 
-     * <code>Collection</code>
-     */
-    public Collection getNames()
-    {
-        // the key set is the collection of names
-        return optionMap.keySet();
-    }
-
-    /**
-     * @return the options in this group as a <code>Collection</code>
-     */
-    public Collection getOptions()
-    {
-        // the values are the collection of options
-        return optionMap.values();
-    }
-
-    /**
-     * Set the selected option of this group to <code>name</code>.
-     *
-     * @param option the option that is selected
-     * @throws AlreadySelectedException if an option from this group has 
-     * already been selected.
-     */
-    public void setSelected(Option option) throws AlreadySelectedException
-    {
-        // if no option has already been selected or the 
-        // same option is being reselected then set the
-        // selected member variable
-        if (selected == null || selected.equals(option.getOpt()))
-        {
-            selected = option.getOpt();
-        }
-        else
-        {
-            throw new AlreadySelectedException(this, option);
-        }
-    }
-
-    /**
-     * @return the selected option name
-     */
-    public String getSelected()
-    {
-        return selected;
-    }
-
-    /**
-     * @param required specifies if this group is required
-     */
-    public void setRequired(boolean required)
-    {
-        this.required = required;
-    }
-
-    /**
-     * Returns whether this option group is required.
-     *
-     * @return whether this option group is required
-     */
-    public boolean isRequired()
-    {
-        return required;
-    }
-
-    /**
-     * Returns the stringified version of this OptionGroup.
-     * 
-     * @return the stringified representation of this group
-     */
-    public String toString()
-    {
-        StringBuffer buff = new StringBuffer();
-
-        Iterator iter = getOptions().iterator();
-
-        buff.append("[");
-
-        while (iter.hasNext())
-        {
-            Option option = (Option) iter.next();
-
-            if (option.getOpt() != null)
-            {
-                buff.append("-");
-                buff.append(option.getOpt());
-            }
-            else
-            {
-                buff.append("--");
-                buff.append(option.getLongOpt());
-            }
-
-            buff.append(" ");
-            buff.append(option.getDescription());
-
-            if (iter.hasNext())
-            {
-                buff.append(", ");
-            }
-        }
-
-        buff.append("]");
-
-        return buff.toString();
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/OptionValidator.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/OptionValidator.java
deleted file mode 100644
index e051a95..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/OptionValidator.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-/**
- * Validates an Option string.
- *
- * @author John Keyes ( john at integralsource.com )
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- * @since 1.1
- */
-class OptionValidator
-{
-    /**
-     * Validates whether <code>opt</code> is a permissable Option
-     * shortOpt.  The rules that specify if the <code>opt</code>
-     * is valid are:
-     *
-     * <ul>
-     *  <li><code>opt</code> is not NULL</li>
-     *  <li>a single character <code>opt</code> that is either
-     *  ' '(special case), '?', '@' or a letter</li>
-     *  <li>a multi character <code>opt</code> that only contains
-     *  letters.</li>
-     * </ul>
-     *
-     * @param opt The option string to validate
-     * @throws IllegalArgumentException if the Option is not valid.
-     */
-    static void validateOption(String opt) throws IllegalArgumentException
-    {
-        // check that opt is not NULL
-        if (opt == null)
-        {
-            return;
-        }
-
-        // handle the single character opt
-        else if (opt.length() == 1)
-        {
-            char ch = opt.charAt(0);
-
-            if (!isValidOpt(ch))
-            {
-                throw new IllegalArgumentException("illegal option value '" + ch + "'");
-            }
-        }
-
-        // handle the multi character opt
-        else
-        {
-            char[] chars = opt.toCharArray();
-
-            for (int i = 0; i < chars.length; i++)
-            {
-                if (!isValidChar(chars[i]))
-                {
-                    throw new IllegalArgumentException(
-                        "opt contains illegal character value '" + chars[i] + "'");
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns whether the specified character is a valid Option.
-     *
-     * @param c the option to validate
-     * @return true if <code>c</code> is a letter, ' ', '?' or '@',
-     *         otherwise false.
-     */
-    private static boolean isValidOpt(char c)
-    {
-        return isValidChar(c) || c == ' ' || c == '?' || c == '@';
-    }
-
-    /**
-     * Returns whether the specified character is a valid character.
-     *
-     * @param c the character to validate
-     * @return true if <code>c</code> is a letter.
-     */
-    private static boolean isValidChar(char c)
-    {
-        return Character.isJavaIdentifierPart(c);
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Options.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Options.java
deleted file mode 100644
index 67f667e..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Options.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>Main entry-point into the library.</p>
- *
- * <p>Options represents a collection of {@link Option} objects, which
- * describe the possible options for a command-line.<p>
- *
- * <p>It may flexibly parse long and short options, with or without
- * values.  Additionally, it may parse only a portion of a commandline,
- * allowing for flexible multi-stage parsing.<p>
- *
- * @see org.apache.commons.cli.CommandLine
- *
- * @author bob mcwhirter (bob @ werken.com)
- * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public class Options implements Serializable
-{
-    private static final long serialVersionUID = 1L;
-
-    /** a map of the options with the character key */
-    private Map shortOpts = new HashMap();
-
-    /** a map of the options with the long key */
-    private Map longOpts = new HashMap();
-
-    /** a map of the required options */
-    private List requiredOpts = new ArrayList();
-
-    /** a map of the option groups */
-    private Map optionGroups = new HashMap();
-
-    /**
-     * Add the specified option group.
-     *
-     * @param group the OptionGroup that is to be added
-     * @return the resulting Options instance
-     */
-    public Options addOptionGroup(OptionGroup group)
-    {
-        Iterator options = group.getOptions().iterator();
-
-        if (group.isRequired())
-        {
-            requiredOpts.add(group);
-        }
-
-        while (options.hasNext())
-        {
-            Option option = (Option) options.next();
-
-            // an Option cannot be required if it is in an
-            // OptionGroup, either the group is required or
-            // nothing is required
-            option.setRequired(false);
-            addOption(option);
-
-            optionGroups.put(option.getKey(), group);
-        }
-
-        return this;
-    }
-
-    /**
-     * Lists the OptionGroups that are members of this Options instance.
-     *
-     * @return a Collection of OptionGroup instances.
-     */
-    Collection getOptionGroups()
-    {
-        return new HashSet(optionGroups.values());
-    }
-
-    /**
-     * Add an option that only contains a short-name.
-     * It may be specified as requiring an argument.
-     *
-     * @param opt Short single-character name of the option.
-     * @param hasArg flag signally if an argument is required after this option
-     * @param description Self-documenting description
-     * @return the resulting Options instance
-     */
-    public Options addOption(String opt, boolean hasArg, String description)
-    {
-        addOption(opt, null, hasArg, description);
-
-        return this;
-    }
-
-    /**
-     * Add an option that contains a short-name and a long-name.
-     * It may be specified as requiring an argument.
-     *
-     * @param opt Short single-character name of the option.
-     * @param longOpt Long multi-character name of the option.
-     * @param hasArg flag signally if an argument is required after this option
-     * @param description Self-documenting description
-     * @return the resulting Options instance
-     */
-    public Options addOption(String opt, String longOpt, boolean hasArg,
-        String description)
-    {
-        addOption(new Option(opt, longOpt, hasArg, description));
-
-        return this;
-    }
-
-    /**
-     * Adds an option instance
-     *
-     * @param opt the option that is to be added
-     * @return the resulting Options instance
-     */
-    public Options addOption(Option opt)
-    {
-        String key = opt.getKey();
-
-        // add it to the long option list
-        if (opt.hasLongOpt())
-        {
-            longOpts.put(opt.getLongOpt(), opt);
-        }
-
-        // if the option is required add it to the required list
-        if (opt.isRequired())
-        {
-            if (requiredOpts.contains(key))
-            {
-                requiredOpts.remove(requiredOpts.indexOf(key));
-            }
-            requiredOpts.add(key);
-        }
-
-        shortOpts.put(key, opt);
-
-        return this;
-    }
-
-    /**
-     * Retrieve a read-only list of options in this set
-     *
-     * @return read-only Collection of {@link Option} objects in this descriptor
-     */
-    public Collection getOptions()
-    {
-        return Collections.unmodifiableCollection(helpOptions());
-    }
-
-    /**
-     * Returns the Options for use by the HelpFormatter.
-     *
-     * @return the List of Options
-     */
-    List helpOptions()
-    {
-        return new ArrayList(shortOpts.values());
-    }
-
-    /**
-     * Returns the required options.
-     *
-     * @return List of required options
-     */
-    public List getRequiredOptions()
-    {
-        return requiredOpts;
-    }
-
-    /**
-     * Retrieve the {@link Option} matching the long or short name specified.
-     * The leading hyphens in the name are ignored (up to 2).
-     *
-     * @param opt short or long name of the {@link Option}
-     * @return the option represented by opt
-     */
-    public Option getOption(String opt)
-    {
-        opt = Util.stripLeadingHyphens(opt);
-
-        if (shortOpts.containsKey(opt))
-        {
-            return (Option) shortOpts.get(opt);
-        }
-
-        return (Option) longOpts.get(opt);
-    }
-
-    /**
-     * Returns whether the named {@link Option} is a member of this {@link Options}.
-     *
-     * @param opt short or long name of the {@link Option}
-     * @return true if the named {@link Option} is a member
-     * of this {@link Options}
-     */
-    public boolean hasOption(String opt)
-    {
-        opt = Util.stripLeadingHyphens(opt);
-
-        return shortOpts.containsKey(opt) || longOpts.containsKey(opt);
-    }
-
-    /**
-     * Returns the OptionGroup the <code>opt</code> belongs to.
-     * @param opt the option whose OptionGroup is being queried.
-     *
-     * @return the OptionGroup if <code>opt</code> is part
-     * of an OptionGroup, otherwise return null
-     */
-    public OptionGroup getOptionGroup(Option opt)
-    {
-        return (OptionGroup) optionGroups.get(opt.getKey());
-    }
-
-    /**
-     * Dump state, suitable for debugging.
-     *
-     * @return Stringified form of this object
-     */
-    public String toString()
-    {
-        StringBuffer buf = new StringBuffer();
-
-        buf.append("[ Options: [ short ");
-        buf.append(shortOpts.toString());
-        buf.append(" ] [ long ");
-        buf.append(longOpts);
-        buf.append(" ]");
-
-        return buf.toString();
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/ParseException.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/ParseException.java
deleted file mode 100644
index 94620e2..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/ParseException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-/**
- * Base for Exceptions thrown during parsing of a command-line.
- *
- * @author bob mcwhirter (bob @ werken.com)
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public class ParseException extends Exception
-{
-    /**
-     * Construct a new <code>ParseException</code>
-     * with the specified detail message.
-     *
-     * @param message the detail message
-     */
-    public ParseException(String message)
-    {
-        super(message);
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Parser.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Parser.java
deleted file mode 100644
index bca2633..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Parser.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Properties;
-
-/**
- * <code>Parser</code> creates {@link CommandLine}s.
- *
- * @author John Keyes (john at integralsource.com)
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public abstract class Parser implements CommandLineParser
-{
-    /** commandline instance */
-    protected CommandLine cmd;
-
-    /** current Options */
-    private Options options;
-
-    /** list of required options strings */
-    private List requiredOptions;
-
-    protected void setOptions(final Options options)
-    {
-        this.options = options;
-        this.requiredOptions = new ArrayList(options.getRequiredOptions());
-    }
-
-    protected Options getOptions()
-    {
-        return options;
-    }
-
-    protected List getRequiredOptions()
-    {
-        return requiredOptions;
-    }
-
-    /**
-     * Subclasses must implement this method to reduce
-     * the <code>arguments</code> that have been passed to the parse method.
-     *
-     * @param opts The Options to parse the arguments by.
-     * @param arguments The arguments that have to be flattened.
-     * @param stopAtNonOption specifies whether to stop
-     * flattening when a non option has been encountered
-     * @return a String array of the flattened arguments
-     */
-    protected abstract String[] flatten(Options opts, String[] arguments,
-        boolean stopAtNonOption);
-
-    /**
-     * Parses the specified <code>arguments</code> based
-     * on the specifed {@link Options}.
-     *
-     * @param options the <code>Options</code>
-     * @param arguments the <code>arguments</code>
-     * @return the <code>CommandLine</code>
-     * @throws ParseException if an error occurs when parsing the
-     * arguments.
-     */
-    public CommandLine parse(Options options, String[] arguments) throws ParseException
-    {
-        return parse(options, arguments, null, false);
-    }
-
-    /**
-     * Parse the arguments according to the specified options and properties.
-     *
-     * @param options    the specified Options
-     * @param arguments  the command line arguments
-     * @param properties command line option name-value pairs
-     * @return the list of atomic option and value tokens
-     * @throws ParseException if there are any problems encountered
-     *                        while parsing the command line tokens.
-     *
-     * @since 1.1
-     */
-    public CommandLine parse(Options options, String[] arguments, Properties properties)
-        throws ParseException
-    {
-        return parse(options, arguments, properties, false);
-    }
-
-    /**
-     * Parses the specified <code>arguments</code>
-     * based on the specifed {@link Options}.
-     *
-     * @param options         the <code>Options</code>
-     * @param arguments       the <code>arguments</code>
-     * @param stopAtNonOption specifies whether to stop interpreting the
-     *                        arguments when a non option has been encountered
-     *                        and to add them to the CommandLines args list.
-     * @return the <code>CommandLine</code>
-     * @throws ParseException if an error occurs when parsing the arguments.
-     */
-    public CommandLine parse(Options options, String[] arguments, boolean stopAtNonOption)
-        throws ParseException
-    {
-        return parse(options, arguments, null, stopAtNonOption);
-    }
-
-    /**
-     * Parse the arguments according to the specified options and
-     * properties.
-     *
-     * @param options the specified Options
-     * @param arguments the command line arguments
-     * @param properties command line option name-value pairs
-     * @param stopAtNonOption stop parsing the arguments when the first
-     * non option is encountered.
-     *
-     * @return the list of atomic option and value tokens
-     *
-     * @throws ParseException if there are any problems encountered
-     * while parsing the command line tokens.
-     *
-     * @since 1.1
-     */
-    public CommandLine parse(Options options, String[] arguments, Properties properties,
-        boolean stopAtNonOption) throws ParseException
-    {
-        // clear out the data in options in case it's been used before (CLI-71)
-        for (Iterator it = options.helpOptions().iterator(); it.hasNext();)
-        {
-            Option opt = (Option) it.next();
-            opt.clearValues();
-        }
-
-        // initialise members
-        setOptions(options);
-
-        cmd = new CommandLine();
-
-        boolean eatTheRest = false;
-
-        if (arguments == null)
-        {
-            arguments = new String[0];
-        }
-
-        List tokenList = Arrays.asList(flatten(getOptions(), arguments, stopAtNonOption));
-
-        ListIterator iterator = tokenList.listIterator();
-
-        // process each flattened token
-        while (iterator.hasNext())
-        {
-            String t = (String) iterator.next();
-
-            // the value is the double-dash
-            if ("--".equals(t))
-            {
-                eatTheRest = true;
-            }
-
-            // the value is a single dash
-            else if ("-".equals(t))
-            {
-                if (stopAtNonOption)
-                {
-                    eatTheRest = true;
-                }
-                else
-                {
-                    cmd.addArg(t);
-                }
-            }
-
-            // the value is an option
-            else if (t.startsWith("-"))
-            {
-                if (stopAtNonOption && !getOptions().hasOption(t))
-                {
-                    eatTheRest = true;
-                    cmd.addArg(t);
-                }
-                else
-                {
-                    processOption(t, iterator);
-                }
-            }
-
-            // the value is an argument
-            else
-            {
-                cmd.addArg(t);
-
-                if (stopAtNonOption)
-                {
-                    eatTheRest = true;
-                }
-            }
-
-            // eat the remaining tokens
-            if (eatTheRest)
-            {
-                while (iterator.hasNext())
-                {
-                    String str = (String) iterator.next();
-
-                    // ensure only one double-dash is added
-                    if (!"--".equals(str))
-                    {
-                        cmd.addArg(str);
-                    }
-                }
-            }
-        }
-
-        processProperties(properties);
-        checkRequiredOptions();
-
-        return cmd;
-    }
-
-    /**
-     * Sets the values of Options using the values in <code>properties</code>.
-     *
-     * @param properties The value properties to be processed.
-     */
-    protected void processProperties(Properties properties)
-    {
-        if (properties == null)
-        {
-            return;
-        }
-
-        for (Enumeration e = properties.propertyNames(); e.hasMoreElements();)
-        {
-            String option = e.nextElement().toString();
-
-            if (!cmd.hasOption(option))
-            {
-                Option opt = getOptions().getOption(option);
-
-                // get the value from the properties instance
-                String value = properties.getProperty(option);
-
-                if (opt.hasArg())
-                {
-                    if (opt.getValues() == null || opt.getValues().length == 0)
-                    {
-                        try
-                        {
-                            opt.addValueForProcessing(value);
-                        }
-                        catch (RuntimeException exp)
-                        {
-                            // if we cannot add the value don't worry about it
-                        }
-                    }
-                }
-                else if (!("yes".equalsIgnoreCase(value)
-                    || "true".equalsIgnoreCase(value) || "1".equalsIgnoreCase(value)))
-                {
-                    // if the value is not yes, true or 1 then don't add the
-                    // option to the CommandLine
-                    break;
-                }
-
-                cmd.addOption(opt);
-            }
-        }
-    }
-
-    /**
-     * Throws a {@link MissingOptionException} if all of the required options
-     * are not present.
-     *
-     * @throws MissingOptionException if any of the required Options
-     * are not present.
-     */
-    protected void checkRequiredOptions() throws MissingOptionException
-    {
-        // if there are required options that have not been processsed
-        if (!getRequiredOptions().isEmpty())
-        {
-            throw new MissingOptionException(getRequiredOptions());
-        }
-    }
-
-    /**
-     * <p>Process the argument values for the specified Option
-     * <code>opt</code> using the values retrieved from the
-     * specified iterator <code>iter</code>.
-     *
-     * @param opt The current Option
-     * @param iter The iterator over the flattened command line
-     * Options.
-     *
-     * @throws ParseException if an argument value is required
-     * and it is has not been found.
-     */
-    public void processArgs(Option opt, ListIterator iter) throws ParseException
-    {
-        // loop until an option is found
-        while (iter.hasNext())
-        {
-            String str = (String) iter.next();
-
-            // found an Option, not an argument
-            if (getOptions().hasOption(str) && str.startsWith("-"))
-            {
-                iter.previous();
-                break;
-            }
-
-            // found a value
-            try
-            {
-                opt.addValueForProcessing(Util.stripLeadingAndTrailingQuotes(str));
-            }
-            catch (RuntimeException exp)
-            {
-                iter.previous();
-                break;
-            }
-        }
-
-        if (opt.getValues() == null && !opt.hasOptionalArg())
-        {
-            throw new MissingArgumentException(opt);
-        }
-    }
-
-    /**
-     * Process the Option specified by <code>arg</code> using the values
-     * retrieved from the specfied iterator <code>iter</code>.
-     *
-     * @param arg The String value representing an Option
-     * @param iter The iterator over the flattened command line arguments.
-     *
-     * @throws ParseException if <code>arg</code> does not represent an Option
-     */
-    protected void processOption(String arg, ListIterator iter) throws ParseException
-    {
-        boolean hasOption = getOptions().hasOption(arg);
-
-        // if there is no option throw an UnrecognisedOptionException
-        if (!hasOption)
-        {
-            throw new UnrecognizedOptionException("Unrecognized option: " + arg, arg);
-        }
-
-        // get the option represented by arg
-        Option opt = (Option) getOptions().getOption(arg).clone();
-
-        // if the option is a required option remove the option from
-        // the requiredOptions list
-        if (opt.isRequired())
-        {
-            getRequiredOptions().remove(opt.getKey());
-        }
-
-        // if the option is in an OptionGroup make that option the selected
-        // option of the group
-        if (getOptions().getOptionGroup(opt) != null)
-        {
-            OptionGroup group = getOptions().getOptionGroup(opt);
-
-            if (group.isRequired())
-            {
-                getRequiredOptions().remove(group);
-            }
-
-            group.setSelected(opt);
-        }
-
-        // if the option takes an argument value
-        if (opt.hasArg())
-        {
-            processArgs(opt, iter);
-        }
-
-        // set the option on the command line
-        cmd.addOption(opt);
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/PatternOptionBuilder.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/PatternOptionBuilder.java
deleted file mode 100644
index 596e6b3..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/PatternOptionBuilder.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.net.URL;
-import java.util.Date;
-
-/**
- * <p>
- * Allows Options to be created from a single String.
- * The pattern contains various single character flags and via
- * an optional punctuation character, their expected type.
- * </p>
- *
- * <table border="1">
- * <tr><td>a</td><td>-a flag</td></tr>
- * <tr><td>b@</td><td>-b [classname]</td></tr>
- * <tr><td>c&gt;</td><td>-c [filename]</td></tr>
- * <tr><td>d+</td><td>-d [classname] (creates object via empty contructor)</td></tr>
- * <tr><td>e%</td><td>-e [number] (creates Double/Long instance depeding on existing of a '.')</td></tr>
- * <tr><td>f/</td><td>-f [url]</td></tr>
- * <tr><td>g:</td><td>-g [string]</td></tr>
- * </table>
- *
- * <p>
- * For example, the following allows command line flags of '-v -p string-value -f /dir/file'.
- * The exclamation mark precede a mandatory option.
- * </p>
- * <code>Options options = PatternOptionBuilder.parsePattern("vp:!f/");</code>
- *
- * <p>
- * TODO These need to break out to OptionType and also
- * to be pluggable.
- * </p>
- *
- * @version $Revision: 734339 $, $Date: 2009-01-13 21:56:47 -0800 (Tue, 13 Jan 2009) $
- */
-public class PatternOptionBuilder
-{
-    /** String class */
-    public static final Class STRING_VALUE = String.class;
-
-    /** Object class */
-    public static final Class OBJECT_VALUE = Object.class;
-
-    /** Number class */
-    public static final Class NUMBER_VALUE = Number.class;
-
-    /** Date class */
-    public static final Class DATE_VALUE = Date.class;
-
-    /** Class class */
-    public static final Class CLASS_VALUE = Class.class;
-
-    /// can we do this one??
-    // is meant to check that the file exists, else it errors.
-    // ie) it's for reading not writing.
-
-    /** FileInputStream class */
-    public static final Class EXISTING_FILE_VALUE = FileInputStream.class;
-
-    /** File class */
-    public static final Class FILE_VALUE = File.class;
-
-    /** File array class */
-    public static final Class FILES_VALUE = File[].class;
-
-    /** URL class */
-    public static final Class URL_VALUE = URL.class;
-
-    /**
-     * Retrieve the class that <code>ch</code> represents.
-     *
-     * @param ch the specified character
-     * @return The class that <code>ch</code> represents
-     */
-    public static Object getValueClass(char ch)
-    {
-        switch (ch)
-        {
-            case '@':
-                return PatternOptionBuilder.OBJECT_VALUE;
-            case ':':
-                return PatternOptionBuilder.STRING_VALUE;
-            case '%':
-                return PatternOptionBuilder.NUMBER_VALUE;
-            case '+':
-                return PatternOptionBuilder.CLASS_VALUE;
-            case '#':
-                return PatternOptionBuilder.DATE_VALUE;
-            case '<':
-                return PatternOptionBuilder.EXISTING_FILE_VALUE;
-            case '>':
-                return PatternOptionBuilder.FILE_VALUE;
-            case '*':
-                return PatternOptionBuilder.FILES_VALUE;
-            case '/':
-                return PatternOptionBuilder.URL_VALUE;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns whether <code>ch</code> is a value code, i.e.
-     * whether it represents a class in a pattern.
-     *
-     * @param ch the specified character
-     * @return true if <code>ch</code> is a value code, otherwise false.
-     */
-    public static boolean isValueCode(char ch)
-    {
-        return ch == '@' || ch == ':' || ch == '%' || ch == '+' || ch == '#' || ch == '<'
-            || ch == '>' || ch == '*' || ch == '/' || ch == '!';
-    }
-
-    /**
-     * Returns the {@link Options} instance represented by <code>pattern</code>.
-     *
-     * @param pattern the pattern string
-     * @return The {@link Options} instance
-     */
-    public static Options parsePattern(String pattern)
-    {
-        char opt = ' ';
-        boolean required = false;
-        Object type = null;
-
-        Options options = new Options();
-
-        for (int i = 0; i < pattern.length(); i++)
-        {
-            char ch = pattern.charAt(i);
-
-            // a value code comes after an option and specifies
-            // details about it
-            if (!isValueCode(ch))
-            {
-                if (opt != ' ')
-                {
-                    OptionBuilder.hasArg(type != null);
-                    OptionBuilder.isRequired(required);
-                    OptionBuilder.withType(type);
-
-                    // we have a previous one to deal with
-                    options.addOption(OptionBuilder.create(opt));
-                    required = false;
-                    type = null;
-                    opt = ' ';
-                }
-
-                opt = ch;
-            }
-            else if (ch == '!')
-            {
-                required = true;
-            }
-            else
-            {
-                type = getValueClass(ch);
-            }
-        }
-
-        if (opt != ' ')
-        {
-            OptionBuilder.hasArg(type != null);
-            OptionBuilder.isRequired(required);
-            OptionBuilder.withType(type);
-
-            // we have a final one to deal with
-            options.addOption(OptionBuilder.create(opt));
-        }
-
-        return options;
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/PosixParser.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/PosixParser.java
deleted file mode 100644
index 5969db6..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/PosixParser.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * The class PosixParser provides an implementation of the
- * {@link Parser#flatten(Options,String[],boolean) flatten} method.
- *
- * @author John Keyes (john at integralsource.com)
- * @version $Revision: 695760 $, $Date: 2008-09-16 01:05:03 -0700 (Tue, 16 Sep 2008) $
- */
-public class PosixParser extends Parser
-{
-    /** holder for flattened tokens */
-    private List tokens = new ArrayList();
-
-    /** specifies if bursting should continue */
-    private boolean eatTheRest;
-
-    /** holder for the current option */
-    private Option currentOption;
-
-    /** the command line Options */
-    private Options options;
-
-    /**
-     * Resets the members to their original state i.e. remove
-     * all of <code>tokens</code> entries and set <code>eatTheRest</code>
-     * to false.
-     */
-    private void init()
-    {
-        eatTheRest = false;
-        tokens.clear();
-    }
-
-    /**
-     * <p>An implementation of {@link Parser}'s abstract
-     * {@link Parser#flatten(Options,String[],boolean) flatten} method.</p>
-     *
-     * <p>The following are the rules used by this flatten method.
-     * <ol>
-     *  <li>if <code>stopAtNonOption</code> is <b>true</b> then do not
-     *  burst anymore of <code>arguments</code> entries, just add each
-     *  successive entry without further processing.  Otherwise, ignore
-     *  <code>stopAtNonOption</code>.</li>
-     *  <li>if the current <code>arguments</code> entry is "<b>--</b>"
-     *  just add the entry to the list of processed tokens</li>
-     *  <li>if the current <code>arguments</code> entry is "<b>-</b>"
-     *  just add the entry to the list of processed tokens</li>
-     *  <li>if the current <code>arguments</code> entry is two characters
-     *  in length and the first character is "<b>-</b>" then check if this
-     *  is a valid {@link Option} id.  If it is a valid id, then add the
-     *  entry to the list of processed tokens and set the current {@link Option}
-     *  member.  If it is not a valid id and <code>stopAtNonOption</code>
-     *  is true, then the remaining entries are copied to the list of
-     *  processed tokens.  Otherwise, the current entry is ignored.</li>
-     *  <li>if the current <code>arguments</code> entry is more than two
-     *  characters in length and the first character is "<b>-</b>" then
-     *  we need to burst the entry to determine its constituents.  For more
-     *  information on the bursting algorithm see
-     *  {@link PosixParser#burstToken(String, boolean) burstToken}.</li>
-     *  <li>if the current <code>arguments</code> entry is not handled
-     *  by any of the previous rules, then the entry is added to the list
-     *  of processed tokens.</li>
-     * </ol>
-     * </p>
-     *
-     * @param options The command line {@link Options}
-     * @param arguments The command line arguments to be parsed
-     * @param stopAtNonOption Specifies whether to stop flattening
-     * when an non option is found.
-     * @return The flattened <code>arguments</code> String array.
-     */
-    protected String[] flatten(Options options, String[] arguments,
-        boolean stopAtNonOption)
-    {
-        init();
-        this.options = options;
-
-        // an iterator for the command line tokens
-        Iterator iter = Arrays.asList(arguments).iterator();
-
-        // process each command line token
-        while (iter.hasNext())
-        {
-            // get the next command line token
-            String token = (String) iter.next();
-
-            // handle long option --foo or --foo=bar
-            if (token.startsWith("--"))
-            {
-                int pos = token.indexOf('=');
-                String opt = pos == -1 ? token : token.substring(0, pos); // --foo
-
-                if (!options.hasOption(opt))
-                {
-                    processNonOptionToken(token, stopAtNonOption);
-                }
-                else
-                {
-                    currentOption = options.getOption(opt);
-
-                    tokens.add(opt);
-                    if (pos != -1)
-                    {
-                        tokens.add(token.substring(pos + 1));
-                    }
-                }
-            }
-
-            // single hyphen
-            else if ("-".equals(token))
-            {
-                tokens.add(token);
-            }
-            else if (token.startsWith("-"))
-            {
-                if (token.length() == 2 || options.hasOption(token))
-                {
-                    processOptionToken(token, stopAtNonOption);
-                }
-                // requires bursting
-                else
-                {
-                    burstToken(token, stopAtNonOption);
-                }
-            }
-            else
-            {
-                processNonOptionToken(token, stopAtNonOption);
-            }
-
-            gobble(iter);
-        }
-
-        return (String[]) tokens.toArray(new String[tokens.size()]);
-    }
-
-    /**
-     * Adds the remaining tokens to the processed tokens list.
-     *
-     * @param iter An iterator over the remaining tokens
-     */
-    private void gobble(Iterator iter)
-    {
-        if (eatTheRest)
-        {
-            while (iter.hasNext())
-            {
-                tokens.add(iter.next());
-            }
-        }
-    }
-
-    /**
-     * Add the special token "<b>--</b>" and the current <code>value</code>
-     * to the processed tokens list. Then add all the remaining
-     * <code>argument</code> values to the processed tokens list.
-     *
-     * @param value The current token
-     */
-    private void processNonOptionToken(String value, boolean stopAtNonOption)
-    {
-        if (stopAtNonOption && (currentOption == null || !currentOption.hasArg()))
-        {
-            eatTheRest = true;
-            tokens.add("--");
-        }
-
-        tokens.add(value);
-    }
-
-    /**
-     * <p>If an {@link Option} exists for <code>token</code> then
-     * add the token to the processed list.</p>
-     *
-     * <p>If an {@link Option} does not exist and <code>stopAtNonOption</code>
-     * is set then add the remaining tokens to the processed tokens list
-     * directly.</p>
-     *
-     * @param token The current option token
-     * @param stopAtNonOption Specifies whether flattening should halt
-     * at the first non option.
-     */
-    private void processOptionToken(String token, boolean stopAtNonOption)
-    {
-        if (stopAtNonOption && !options.hasOption(token))
-        {
-            eatTheRest = true;
-        }
-
-        if (options.hasOption(token))
-        {
-            currentOption = options.getOption(token);
-        }
-
-        tokens.add(token);
-    }
-
-    /**
-     * Breaks <code>token</code> into its constituent parts
-     * using the following algorithm.
-     *
-     * <ul>
-     *  <li>ignore the first character ("<b>-</b>")</li>
-     *  <li>foreach remaining character check if an {@link Option}
-     *  exists with that id.</li>
-     *  <li>if an {@link Option} does exist then add that character
-     *  prepended with "<b>-</b>" to the list of processed tokens.</li>
-     *  <li>if the {@link Option} can have an argument value and there
-     *  are remaining characters in the token then add the remaining
-     *  characters as a token to the list of processed tokens.</li>
-     *  <li>if an {@link Option} does <b>NOT</b> exist <b>AND</b>
-     *  <code>stopAtNonOption</code> <b>IS</b> set then add the special token
-     *  "<b>--</b>" followed by the remaining characters and also
-     *  the remaining tokens directly to the processed tokens list.</li>
-     *  <li>if an {@link Option} does <b>NOT</b> exist <b>AND</b>
-     *  <code>stopAtNonOption</code> <b>IS NOT</b> set then add that
-     *  character prepended with "<b>-</b>".</li>
-     * </ul>
-     *
-     * @param token The current token to be <b>burst</b>
-     * @param stopAtNonOption Specifies whether to stop processing
-     * at the first non-Option encountered.
-     */
-    protected void burstToken(String token, boolean stopAtNonOption)
-    {
-        for (int i = 1; i < token.length(); i++)
-        {
-            String ch = String.valueOf(token.charAt(i));
-
-            if (options.hasOption(ch))
-            {
-                tokens.add("-" + ch);
-                currentOption = options.getOption(ch);
-
-                if (currentOption.hasArg() && (token.length() != (i + 1)))
-                {
-                    tokens.add(token.substring(i + 1));
-
-                    break;
-                }
-            }
-            else if (stopAtNonOption)
-            {
-                processNonOptionToken(token.substring(i), true);
-                break;
-            }
-            else
-            {
-                tokens.add(token);
-                break;
-            }
-        }
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/TypeHandler.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/TypeHandler.java
deleted file mode 100644
index cffe14b..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/TypeHandler.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-import java.io.File;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import java.util.Date;
-
-/**
-  * This is a temporary implementation. TypeHandler will handle the
-  * pluggableness of OptionTypes and it will direct all of these types
-  * of conversion functionalities to ConvertUtils component in Commons
-  * already. BeanUtils I think.
-  *
-  * @version $Revision: 741425 $, $Date: 2009-02-05 22:10:54 -0800 (Thu, 05 Feb 2009) $
-  */
-public class TypeHandler
-{
-    /**
-     * Returns the <code>Object</code> of type <code>obj</code>
-     * with the value of <code>str</code>.
-     *
-     * @param str the command line value
-     * @param obj the type of argument
-     * @return The instance of <code>obj</code> initialised with
-     * the value of <code>str</code>.
-     */
-    public static Object createValue(String str, Object obj) throws ParseException
-    {
-        return createValue(str, (Class) obj);
-    }
-
-    /**
-     * Returns the <code>Object</code> of type <code>clazz</code>
-     * with the value of <code>str</code>.
-     *
-     * @param str the command line value
-     * @param clazz the type of argument
-     * @return The instance of <code>clazz</code> initialised with
-     * the value of <code>str</code>.
-     */
-    public static Object createValue(String str, Class clazz) throws ParseException
-    {
-        if (PatternOptionBuilder.STRING_VALUE == clazz)
-        {
-            return str;
-        }
-        else if (PatternOptionBuilder.OBJECT_VALUE == clazz)
-        {
-            return createObject(str);
-        }
-        else if (PatternOptionBuilder.NUMBER_VALUE == clazz)
-        {
-            return createNumber(str);
-        }
-        else if (PatternOptionBuilder.DATE_VALUE == clazz)
-        {
-            return createDate(str);
-        }
-        else if (PatternOptionBuilder.CLASS_VALUE == clazz)
-        {
-            return createClass(str);
-        }
-        else if (PatternOptionBuilder.FILE_VALUE == clazz)
-        {
-            return createFile(str);
-        }
-        else if (PatternOptionBuilder.EXISTING_FILE_VALUE == clazz)
-        {
-            return createFile(str);
-        }
-        else if (PatternOptionBuilder.FILES_VALUE == clazz)
-        {
-            return createFiles(str);
-        }
-        else if (PatternOptionBuilder.URL_VALUE == clazz)
-        {
-            return createURL(str);
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    /**
-      * Create an Object from the classname and empty constructor.
-      *
-      * @param classname the argument value
-      * @return the initialised object, or null if it couldn't create
-      * the Object.
-      */
-    public static Object createObject(String classname) throws ParseException
-    {
-        Class cl = null;
-
-        try
-        {
-            cl = Class.forName(classname);
-        }
-        catch (ClassNotFoundException cnfe)
-        {
-            throw new ParseException("Unable to find the class: " + classname);
-        }
-
-        Object instance = null;
-
-        try
-        {
-            instance = cl.newInstance();
-        }
-        catch (Exception e)
-        {
-            throw new ParseException(e.getClass().getName()
-                + "; Unable to create an instance of: " + classname);
-        }
-
-        return instance;
-    }
-
-    /**
-     * Create a number from a String. If a . is present, it creates a
-     * Double, otherwise a Long.
-     *
-     * @param str the value
-     * @return the number represented by <code>str</code>, if <code>str</code>
-     * is not a number, null is returned.
-     */
-    public static Number createNumber(String str) throws ParseException
-    {
-        try
-        {
-            if (str.indexOf('.') != -1)
-            {
-                return Double.valueOf(str);
-            }
-            else
-            {
-                return Long.valueOf(str);
-            }
-        }
-        catch (NumberFormatException e)
-        {
-            throw new ParseException(e.getMessage());
-        }
-    }
-
-    /**
-     * Returns the class whose name is <code>classname</code>.
-     *
-     * @param classname the class name
-     * @return The class if it is found, otherwise return null
-     */
-    public static Class createClass(String classname) throws ParseException
-    {
-        try
-        {
-            return Class.forName(classname);
-        }
-        catch (ClassNotFoundException e)
-        {
-            throw new ParseException("Unable to find the class: " + classname);
-        }
-    }
-
-    /**
-     * Returns the date represented by <code>str</code>.
-     *
-     * @param str the date string
-     * @return The date if <code>str</code> is a valid date string,
-     * otherwise return null.
-     */
-    public static Date createDate(String str) throws ParseException
-    {
-        throw new UnsupportedOperationException("Not yet implemented");
-    }
-
-    /**
-     * Returns the URL represented by <code>str</code>.
-     *
-     * @param str the URL string
-     * @return The URL is <code>str</code> is well-formed, otherwise
-     * return null.
-     */
-    public static URL createURL(String str) throws ParseException
-    {
-        try
-        {
-            return new URL(str);
-        }
-        catch (MalformedURLException e)
-        {
-            throw new ParseException("Unable to parse the URL: " + str);
-        }
-    }
-
-    /**
-     * Returns the File represented by <code>str</code>.
-     *
-     * @param str the File location
-     * @return The file represented by <code>str</code>.
-     */
-    public static File createFile(String str) throws ParseException
-    {
-        return new File(str);
-    }
-
-    /**
-     * Returns the File[] represented by <code>str</code>.
-     *
-     * @param str the paths to the files
-     * @return The File[] represented by <code>str</code>.
-     */
-    public static File[] createFiles(String str) throws ParseException
-    {
-        // to implement/port:
-        //        return FileW.findFiles(str);
-        throw new UnsupportedOperationException("Not yet implemented");
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/UnrecognizedOptionException.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/UnrecognizedOptionException.java
deleted file mode 100644
index 8cb49c9..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/UnrecognizedOptionException.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-/**
- * Exception thrown during parsing signalling an unrecognized
- * option was seen.
- *
- * @author bob mcwhiter (bob @ werken.com)
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-public class UnrecognizedOptionException extends ParseException
-{
-    /** The  unrecognized option */
-    private String option;
-
-    /**
-     * Construct a new <code>UnrecognizedArgumentException</code>
-     * with the specified detail message.
-     *
-     * @param message the detail message
-     */
-    public UnrecognizedOptionException(String message)
-    {
-        super(message);
-    }
-
-    /**
-     * Construct a new <code>UnrecognizedArgumentException</code>
-     * with the specified option and detail message.
-     *
-     * @param message the detail message
-     * @param option  the unrecognized option
-     * @since 1.2
-     */
-    public UnrecognizedOptionException(String message, String option)
-    {
-        this(message);
-        this.option = option;
-    }
-
-    /**
-     * Returns the unrecognized option.
-     *
-     * @return the related option
-     * @since 1.2
-     */
-    public String getOption()
-    {
-        return option;
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Util.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Util.java
deleted file mode 100644
index 7d18e3b..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/Util.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.cli;
-
-/**
- * Contains useful helper methods for classes within this package.
- *
- * @author John Keyes (john at integralsource.com)
- * @version $Revision: 680644 $, $Date: 2008-07-29 01:13:48 -0700 (Tue, 29 Jul 2008) $
- */
-class Util
-{
-    /**
-     * Remove the hyphens from the begining of <code>str</code> and
-     * return the new String.
-     *
-     * @param str The string from which the hyphens should be removed.
-     *
-     * @return the new String.
-     */
-    static String stripLeadingHyphens(String str)
-    {
-        if (str == null)
-        {
-            return null;
-        }
-        if (str.startsWith("--"))
-        {
-            return str.substring(2, str.length());
-        }
-        else if (str.startsWith("-"))
-        {
-            return str.substring(1, str.length());
-        }
-
-        return str;
-    }
-
-    /**
-     * Remove the leading and trailing quotes from <code>str</code>.
-     * E.g. if str is '"one two"', then 'one two' is returned.
-     *
-     * @param str The string from which the leading and trailing quotes
-     * should be removed.
-     *
-     * @return The string without the leading and trailing quotes.
-     */
-    static String stripLeadingAndTrailingQuotes(String str)
-    {
-        if (str.startsWith("\""))
-        {
-            str = str.substring(1, str.length());
-        }
-        if (str.endsWith("\""))
-        {
-            str = str.substring(0, str.length() - 1);
-        }
-        return str;
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/overview.html b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/overview.html
deleted file mode 100644
index eec9ce7..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/overview.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<body>
-
-    <p>Commons CLI -- version 1.2</p>
-
-    <p>The commons-cli package aides in parsing command-line arguments.</p>
-
-    <p>Allow command-line arguments to be parsed against a descriptor of
-    valid options (long and short), potentially with arguments.</p>
-
-    <p>command-line arguments may be of the typical <code>String[]</code>
-    form, but also may be a <code>java.util.List</code>.  Indexes allow
-    for parsing only a portion of the command-line.  Also, functionality
-    for parsing the command-line in phases is built in, allowing for
-    'cvs-style' command-lines, where some global options are specified
-    before a 'command' argument, and command-specific options are
-    specified after the command argument:
-
-    <code>
-    <pre>
-        myApp -p &lt;port&gt; command -p &lt;printer&gt;
-    </pre>
-    </code>
-
-
-    <p>The homepage for the project is
-    <a href="http://commons.apache.org">Apache Commons/</a>
-</body>
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/package.html b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/package.html
deleted file mode 100644
index 20ebdde..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/cli/package.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<body>
-
-    Commons CLI 1.2
-
-</body>
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/Action.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/Action.java
deleted file mode 100644
index 40dd629..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/Action.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.io;
-
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-
-import org.osgi.framework.BundleException;
-import org.osgi.framework.launch.Framework;
-
-import org.apache.felix.sigil.common.runtime.Main;
-
-import static org.apache.felix.sigil.common.runtime.io.Constants.OK;
-import static org.apache.felix.sigil.common.runtime.io.Constants.ERROR;
-
-/**
- * @author dave
- *
- */
-public abstract class Action<I, O>
-{
-    private static final String PREFIX = "\t";
-    private static final String ASCII = "ASCII";
-    private final DataInputStream in;
-    private final DataOutputStream out;
-
-    public Action(DataInputStream in, DataOutputStream out) throws IOException
-    {
-        this.in = in;
-        this.out = out;
-    }
-
-    public O client() throws IOException, BundleException
-    {
-        return client(null);
-    }
-
-    public abstract O client(I input) throws IOException, BundleException;
-
-    public abstract void server(Framework fw) throws IOException;
-
-    protected boolean checkOk() throws IOException
-    {
-        int ch = readInt();
-        switch (ch)
-        {
-            case OK:
-                return true;
-            case ERROR:
-                return false;
-            default:
-                throw new IOException("Unexpected return code " + ch);
-        }
-    }
-
-    protected void writeOk() throws IOException
-    {
-        writeInt(OK);
-    }
-
-    protected void writeError() throws IOException
-    {
-        writeInt(ERROR);
-    }
-
-    protected void writeThrowable(Throwable t) throws IOException
-    {
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        t.printStackTrace(new PrintStream(bos));
-        writeString(bos.toString());
-    }
-
-    protected String readString() throws IOException
-    {
-        int l = in.readInt();
-        if (l == -1)
-        {
-            return null;
-        }
-        else
-        {
-            byte[] buf = new byte[l];
-            in.readFully(buf);
-            return new String(buf, ASCII);
-        }
-    }
-
-    protected void writeString(String str) throws IOException
-    {
-        if (str == null)
-        {
-            out.writeInt(-1);
-        }
-        else
-        {
-            byte[] buf = str.getBytes(ASCII);
-            out.writeInt(buf.length);
-            out.write(buf);
-        }
-    }
-
-    protected void writeInt(int i) throws IOException
-    {
-        out.writeInt(i);
-    }
-
-    protected int readInt() throws IOException
-    {
-        return in.readInt();
-    }
-
-    protected void writeLong(long l) throws IOException
-    {
-        out.writeLong(l);
-    }
-
-    protected long readLong() throws IOException
-    {
-        return in.readLong();
-    }
-
-    protected void writeBoolean(boolean b) throws IOException
-    {
-        out.writeBoolean(b);
-    }
-
-    protected boolean readBoolean() throws IOException
-    {
-        return in.readBoolean();
-    }
-
-    protected void flush() throws IOException
-    {
-        out.flush();
-    }
-
-    protected void log(String msg)
-    {
-        Main.log(msg);
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/Constants.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/Constants.java
deleted file mode 100644
index 2f56779..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/Constants.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.io;
-
-public interface Constants
-{
-    public static final int OK = 0;
-    public static final int ERROR = -1;
-
-    public static final int INSTALL = 1;
-    public static final int START = 2;
-    public static final int STOP = 3;
-    public static final int UNINSTALL = 4;
-    public static final int UPDATE = 5;
-    public static final int STATUS = 6;
-    public static final int REFRESH = 7;
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/InstallAction.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/InstallAction.java
deleted file mode 100644
index 8fe3210..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/InstallAction.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.io;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.launch.Framework;
-
-import static org.apache.felix.sigil.common.runtime.io.Constants.INSTALL;
-
-/**
- * @author dave
- *
- */
-public class InstallAction extends Action<String, Long>
-{
-
-    public InstallAction(DataInputStream in, DataOutputStream out) throws IOException
-    {
-        super(in, out);
-    }
-
-    @Override
-    public Long client(String url) throws IOException, BundleException
-    {
-        writeInt(INSTALL);
-        writeString(url);
-        flush();
-        if (checkOk())
-        {
-            return readLong();
-        }
-        else
-        {
-            String msg = readString();
-            throw new BundleException(msg);
-        }
-    }
-
-    @Override
-    public void server(Framework fw) throws IOException
-    {
-        String url = readString();
-        try
-        {
-            Bundle val = fw.getBundleContext().installBundle(url);
-            log("Installed " + url);
-            writeOk();
-            writeLong(val.getBundleId());
-        }
-        catch (BundleException e)
-        {
-            e.printStackTrace();
-            writeError();
-            writeThrowable(e);
-        }
-        flush();
-    }
-
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/RefreshAction.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/RefreshAction.java
deleted file mode 100644
index c2ec3ec..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/RefreshAction.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.common.runtime.io;
-
-import static org.apache.felix.sigil.common.runtime.io.Constants.REFRESH;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-import org.osgi.framework.BundleException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.launch.Framework;
-import org.osgi.service.packageadmin.PackageAdmin;
-
-public class RefreshAction extends Action<Void, Void>
-{
-
-    public RefreshAction(DataInputStream in, DataOutputStream out) throws IOException
-    {
-        super(in, out);
-    }
-
-    @Override
-    public Void client(Void input) throws IOException, BundleException
-    {
-        writeInt(REFRESH);
-        flush();
-        if (checkOk())
-        {
-            return null;
-        }
-        else
-        {
-            String msg = readString();
-            throw new BundleException(msg);
-        }
-    }
-
-    @Override
-    public void server(Framework fw) throws IOException
-    {
-        ServiceReference ref = fw.getBundleContext().getServiceReference(
-            PackageAdmin.class.getName());
-        if (ref != null)
-        {
-            PackageAdmin pa = (PackageAdmin) fw.getBundleContext().getService(ref);
-            if (pa != null)
-            {
-                try
-                {
-                    pa.refreshPackages(null);
-                }
-                finally
-                {
-                    fw.getBundleContext().ungetService(ref);
-                }
-            }
-        }
-        writeOk();
-        flush();
-    }
-
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/StartAction.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/StartAction.java
deleted file mode 100644
index 3eb8d0a..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/StartAction.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.io;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.launch.Framework;
-
-import static org.apache.felix.sigil.common.runtime.io.Constants.START;
-
-/**
- * @author dave
- *
- */
-public class StartAction extends Action<Long, Void>
-{
-
-    public StartAction(DataInputStream in, DataOutputStream out) throws IOException
-    {
-        super(in, out);
-    }
-
-    @Override
-    public Void client(Long bundle) throws IOException, BundleException
-    {
-        writeInt(START);
-        writeLong(bundle);
-        flush();
-        if (!checkOk())
-        {
-            String msg = readString();
-            throw new BundleException(msg);
-        }
-        return null;
-    }
-
-    @Override
-    public void server(Framework fw) throws IOException
-    {
-        long id = readLong();
-        Bundle b = fw.getBundleContext().getBundle(id);
-        if (b == null)
-        {
-            writeError();
-            writeString("Unknown bundle " + id);
-        }
-        else
-        {
-            try
-            {
-                b.start();
-                writeOk();
-                log("Started " + b.getSymbolicName());
-            }
-            catch (BundleException e)
-            {
-                writeError();
-                writeThrowable(e);
-            }
-        }
-        flush();
-    }
-
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/StatusAction.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/StatusAction.java
deleted file mode 100644
index 8fdebd7..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/StatusAction.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.io;
-
-import java.io.DataInputStream;
-
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-
-import org.apache.felix.sigil.common.runtime.BundleForm.BundleStatus;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.launch.Framework;
-
-import static org.apache.felix.sigil.common.runtime.io.Constants.STATUS;
-import static org.osgi.framework.Constants.BUNDLE_VERSION;
-import static org.osgi.framework.Constants.BUNDLE_NAME;
-
-/**
- * @author dave
- *
- */
-public class StatusAction extends Action<Void, BundleStatus[]>
-{
-
-    public StatusAction(DataInputStream in, DataOutputStream out) throws IOException
-    {
-        super(in, out);
-    }
-
-    @Override
-    public BundleStatus[] client(Void in) throws IOException
-    {
-        writeInt(STATUS);
-        flush();
-        int num = readInt();
-        ArrayList<BundleStatus> ret = new ArrayList<BundleStatus>(num);
-
-        for (int i = 0; i < num; i++)
-        {
-            BundleStatus s = new BundleStatus();
-            s.setId(readLong());
-            s.setBundleSymbolicName(readString());
-            s.setVersion(readString());
-            s.setLocation(readString());
-            s.setStatus(readInt());
-            ret.add(s);
-        }
-
-        return ret.toArray(new BundleStatus[num]);
-    }
-
-    @Override
-    public void server(Framework fw) throws IOException
-    {
-        log("Read status");
-        Bundle[] bundles = fw.getBundleContext().getBundles();
-        writeInt(bundles.length);
-        for (Bundle b : bundles)
-        {
-            writeLong(b.getBundleId());
-            String bsn = b.getSymbolicName();
-            if (bsn == null)
-                bsn = (String) b.getHeaders().get(BUNDLE_NAME);
-
-            writeString(bsn);
-            writeString((String) b.getHeaders().get(BUNDLE_VERSION));
-            writeString(b.getLocation());
-            writeInt(b.getState());
-            flush();
-        }
-        flush();
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/StopAction.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/StopAction.java
deleted file mode 100644
index 5af9355..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/StopAction.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.io;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.launch.Framework;
-
-import static org.apache.felix.sigil.common.runtime.io.Constants.STOP;
-
-/**
- * @author dave
- *
- */
-public class StopAction extends Action<Long, Void>
-{
-
-    public StopAction(DataInputStream in, DataOutputStream out) throws IOException
-    {
-        super(in, out);
-        // TODO Auto-generated constructor stub
-    }
-
-    @Override
-    public Void client(Long bundle) throws IOException, BundleException
-    {
-        writeInt(STOP);
-        writeLong(bundle);
-        if (!checkOk())
-        {
-            String msg = readString();
-            throw new BundleException(msg);
-        }
-        return null;
-    }
-
-    @Override
-    public void server(Framework fw) throws IOException
-    {
-        long id = readLong();
-        Bundle b = fw.getBundleContext().getBundle(id);
-        if (b == null)
-        {
-            writeError();
-            writeString("Unknown bundle " + id);
-        }
-        else
-        {
-            try
-            {
-                b.stop();
-                writeOk();
-            }
-            catch (BundleException e)
-            {
-                writeError();
-                writeThrowable(e);
-            }
-        }
-    }
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/UninstallAction.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/UninstallAction.java
deleted file mode 100644
index 7212b26..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/UninstallAction.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.io;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.launch.Framework;
-
-import static org.apache.felix.sigil.common.runtime.io.Constants.UNINSTALL;
-
-/**
- * @author dave
- *
- */
-public class UninstallAction extends Action<Long, Void>
-{
-
-    public UninstallAction(DataInputStream in, DataOutputStream out) throws IOException
-    {
-        super(in, out);
-    }
-
-    @Override
-    public Void client(Long bundle) throws IOException, BundleException
-    {
-        writeInt(UNINSTALL);
-        writeLong(bundle);
-        if (!checkOk())
-        {
-            String msg = readString();
-            throw new BundleException(msg);
-        }
-        return null;
-    }
-
-    @Override
-    public void server(Framework fw) throws IOException
-    {
-        long id = readLong();
-        Bundle b = fw.getBundleContext().getBundle(id);
-        if (b == null)
-        {
-            writeError();
-            writeString("Unknown bundle " + id);
-        }
-        else
-        {
-            try
-            {
-                b.uninstall();
-                writeOk();
-            }
-            catch (BundleException e)
-            {
-                writeError();
-                writeThrowable(e);
-            }
-        }
-    }
-
-}
diff --git a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/UpdateAction.java b/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/UpdateAction.java
deleted file mode 100644
index 628fdd9..0000000
--- a/sigil/common/runtime/src/org/apache/felix/sigil/common/runtime/io/UpdateAction.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.common.runtime.io;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.launch.Framework;
-
-import static org.apache.felix.sigil.common.runtime.io.Constants.UPDATE;
-
-/**
- * @author dave
- *
- */
-public class UpdateAction extends Action<UpdateAction.Update, Void>
-{
-    public static class Update
-    {
-        final long bundleID;
-        final String location;
-
-        public Update(long bundleID, String location)
-        {
-            this.bundleID = bundleID;
-            this.location = location;
-        }
-    }
-
-    public UpdateAction(DataInputStream in, DataOutputStream out) throws IOException
-    {
-        super(in, out);
-        // TODO Auto-generated constructor stub
-    }
-
-    @Override
-    public Void client(Update update) throws IOException, BundleException
-    {
-        writeInt(UPDATE);
-        writeLong(update.bundleID);
-        if (update.location == null)
-        {
-            writeBoolean(false);
-        }
-        else
-        {
-            writeBoolean(true);
-            writeString(update.location);
-        }
-        flush();
-
-        if (!checkOk())
-        {
-            String msg = readString();
-            throw new BundleException(msg);
-        }
-
-        return null;
-    }
-
-    @Override
-    public void server(Framework fw) throws IOException
-    {
-        long id = readLong();
-        Bundle b = fw.getBundleContext().getBundle(id);
-        if (b == null)
-        {
-            writeError();
-            writeString("Unknown bundle " + id);
-        }
-        else
-        {
-            try
-            {
-                boolean remote = readBoolean();
-                if (remote)
-                {
-                    String loc = readString();
-                    try
-                    {
-                        InputStream in = open(loc);
-                        try
-                        {
-                            b.update(in);
-                            writeOk();
-                        }
-                        finally
-                        {
-                            in.close();
-                        }
-                    }
-                    catch (IOException e)
-                    {
-                        writeError();
-                        writeThrowable(e);
-                    }
-                }
-                else
-                {
-                    b.update();
-                    writeOk();
-                }
-            }
-            catch (BundleException e)
-            {
-                writeError();
-                writeString(e.getMessage());
-            }
-        }
-
-        flush();
-    }
-
-    private InputStream open(String loc) throws IOException
-    {
-        URL url = new URL(loc);
-        return url.openStream();
-    }
-}
diff --git a/sigil/common/sigil-defaults.properties b/sigil/common/sigil-defaults.properties
deleted file mode 100644
index bfc9d0d..0000000
--- a/sigil/common/sigil-defaults.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-# sigil common default properties
--defaults: ${BLDCOMMON:-../bldcommon}/sigil-defaults.properties
diff --git a/sigil/eclipse/build.xml b/sigil/eclipse/build.xml
deleted file mode 100644
index c9dba4d..0000000
--- a/sigil/eclipse/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="eclipse" default="build-list">
-  <import file="../bldcommon/common.xml"/>
-</project>
diff --git a/sigil/eclipse/core.feature/.classpath b/sigil/eclipse/core.feature/.classpath
deleted file mode 100644
index dd6ef05..0000000
--- a/sigil/eclipse/core.feature/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/eclipse/core.feature/.project b/sigil/eclipse/core.feature/.project
deleted file mode 100644
index 6160bf9..0000000
--- a/sigil/eclipse/core.feature/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.eclipse.core.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/eclipse/core.feature/.settings/org.eclipse.jdt.core.prefs b/sigil/eclipse/core.feature/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index e8bd922..0000000
--- a/sigil/eclipse/core.feature/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,258 +0,0 @@
-#Thu Sep 17 16:13:17 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/eclipse/core.feature/.settings/org.eclipse.jdt.ui.prefs b/sigil/eclipse/core.feature/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 9f9ff66..0000000
--- a/sigil/eclipse/core.feature/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:13:17 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/eclipse/core.feature/build.xml b/sigil/eclipse/core.feature/build.xml
deleted file mode 100644
index d18a1ae..0000000
--- a/sigil/eclipse/core.feature/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="eclipse.core.feature" default="build">
-  <import file="../build.xml"/>
-</project>
diff --git a/sigil/eclipse/core.feature/feature.xml b/sigil/eclipse/core.feature/feature.xml
deleted file mode 100644
index df9d26e..0000000
--- a/sigil/eclipse/core.feature/feature.xml
+++ /dev/null
@@ -1,149 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<feature
-      id="org.apache.felix.sigil.eclipse.core.feature"
-      label="Sigil SDK"
-      version="${version}"
-      provider-name="Paremus Ltd">
-
-   <description>
-      Sigil plugin, integrated IDE and headless build system for OSGi developers.
-   </description>
-
-   <license url="http://www.apache.org/licenses/LICENSE-2.0">
-      Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-or implied.
-See the License for the specific language governing permissions
-and
-limitations under the License.
-   </license>
-
-   <url>
-      <update url="${update-site}"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.ant.core"/>
-      <import plugin="org.eclipse.core.expressions"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.debug.ui"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.jdt.ui"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.pde.ui"/>
-      <import plugin="org.eclipse.ui.editors"/>
-      <import plugin="org.eclipse.ui.forms"/>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.osgi"/>
-      <import plugin="org.eclipse.jdt.launching"/>
-      <import plugin="org.eclipse.ui.console"/>
-      <import plugin="org.eclipse.jdt.debug.ui"/>
-      <import plugin="org.eclipse.ui.editors" version="3.4.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.jface.text" version="3.4.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui.ide" version="3.4.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.help"/>
-      <import plugin="org.eclipse.zest.core" version="1.0.0" match="compatible"/>
-      <import plugin="org.eclipse.zest.layouts" version="1.0.0" match="compatible"/>
-      <import plugin="org.eclipse.ltk.core.refactoring"/>
-      <import plugin="org.eclipse.help" version="3.3.1" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui.cheatsheets" version="3.3.100" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.equinox.common" version="3.4.0" match="greaterOrEqual"/>
-   </requires>
-
-   <plugin
-         id="com.springsource.org.apache.commons.lang"
-         download-size="0"
-         install-size="0"
-         version="2.4.0"
-         unpack="false"/>
-         
-   <plugin
-         id="org.apache.felix.sigil.common.core"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.felix.sigil.common.osgi"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/>
-         
-   <plugin
-         id="org.apache.felix.sigil.common.runtime"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.felix.sigil.eclipse.core"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/>
-
-   <!--plugin
-         id="org.apache.felix.sigil.eclipse.help"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/-->
-
-   <plugin
-         id="org.apache.felix.sigil.eclipse.runtime"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/>
-         
-   <plugin
-         id="org.apache.felix.sigil.eclipse.search"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.felix.sigil.eclipse.ui"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.felix.sigil.eclipse.utils"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/>
-
-</feature>
diff --git a/sigil/eclipse/core.feature/ivy.xml b/sigil/eclipse/core.feature/ivy.xml
deleted file mode 100644
index 5dba2f4..0000000
--- a/sigil/eclipse/core.feature/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.eclipse.core.feature"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.eclipse.core.feature" />
-   </publications>
-</ivy-module>
diff --git a/sigil/eclipse/core.feature/sigil.properties b/sigil/eclipse/core.feature/sigil.properties
deleted file mode 100644
index 08a4de4..0000000
--- a/sigil/eclipse/core.feature/sigil.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--bundles: \
-	org.apache.felix.sigil.eclipse.core.feature, \
-
--resources: \
-	{feature.xml}, \
-
-# end
diff --git a/sigil/eclipse/core/.classpath b/sigil/eclipse/core/.classpath
deleted file mode 100644
index b644560..0000000
--- a/sigil/eclipse/core/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="lib" path="lib/org.eclipse.swt.carbon.macosx.jar"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/eclipse/core/.project b/sigil/eclipse/core/.project
deleted file mode 100644
index f5e965d..0000000
--- a/sigil/eclipse/core/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.eclipse.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/eclipse/core/.settings/org.eclipse.jdt.core.prefs b/sigil/eclipse/core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 24113b7..0000000
--- a/sigil/eclipse/core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,263 +0,0 @@
-#Thu Sep 17 16:08:38 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/eclipse/core/.settings/org.eclipse.jdt.ui.prefs b/sigil/eclipse/core/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 36e2065..0000000
--- a/sigil/eclipse/core/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:08:38 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/eclipse/core/DEPENDENCIES b/sigil/eclipse/core/DEPENDENCIES
deleted file mode 100644
index e9ad596..0000000
--- a/sigil/eclipse/core/DEPENDENCIES
+++ /dev/null
@@ -1,26 +0,0 @@
-Apache Felix Sigil Eclipse Core
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed by the The Eclipse Foundation
-(http://www.eclipse.org)
-Copyright © 2010 The Eclipse Foundation. All Rights Reserved.
-Licensed under the Eclipse Public License - v 1.0.
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
-- Eclipse Public License - v 1.0
diff --git a/sigil/eclipse/core/NOTICE b/sigil/eclipse/core/NOTICE
deleted file mode 100644
index 7080eb2..0000000
--- a/sigil/eclipse/core/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Eclipse Core
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/eclipse/core/build.xml b/sigil/eclipse/core/build.xml
deleted file mode 100644
index db7659d..0000000
--- a/sigil/eclipse/core/build.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="eclipse.core" default="build"
-  xmlns:ivy="antlib:org.apache.ivy.ant">
-  <import file="../build.xml"/>
-  <target name="init">
-    <ivy:retrieve organisation="org.eclipse" module="org.eclipse.swt.carbon.macosx" revision="3.4.1.v3452b" inline="true" pattern="lib/[artifact].[ext]" transitive="false"/>
-  </target>
-</project>
diff --git a/sigil/eclipse/core/ivy.xml b/sigil/eclipse/core/ivy.xml
deleted file mode 100644
index e4d6526..0000000
--- a/sigil/eclipse/core/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.eclipse.core"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.eclipse.core" />
-   </publications>
-</ivy-module>
diff --git a/sigil/eclipse/core/plugin.xml b/sigil/eclipse/core/plugin.xml
deleted file mode 100644
index 3b14335..0000000
--- a/sigil/eclipse/core/plugin.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<?eclipse version="3.2"?>
-<plugin>
-   <extension-point id="org.apache.felix.sigil.repositoryprovider" name="Bundle Repository Provider" schema="schema/org.apache.felix.sigil.repositoryprovider.exsd"/>
-   <extension-point id="org.apache.felix.sigil.installbuilder" name="OSGi Install Builder" schema="schema/org.apache.felix.sigil.installbuilder.exsd"/>
-   
-   <extension
-         point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester
-            class="org.apache.felix.sigil.eclipse.internal.property.SigilPropertyTester"
-            id="org.apache.felix.sigil.property.SigilPropertyTester"
-            namespace="org.apache.felix.sigil"
-            properties="isSigilProject"
-            type="org.eclipse.core.resources.IResource"/>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.adapters">
-      <factory
-            adaptableType="org.eclipse.core.resources.IFile"
-            class="org.apache.felix.sigil.eclipse.internal.adapter.FileAdaptorFactory">
-         <adapter type="org.apache.felix.sigil.model.eclipse.ISigilBundle"/>
-      </factory>
-      <factory
-            adaptableType="org.eclipse.core.resources.IProject"
-            class="org.apache.felix.sigil.eclipse.internal.adapter.ProjectAdaptorFactory">
-         <adapter type="org.apache.felix.sigil.model.project.ISigilProjectModel"/>
-      </factory>
-   </extension>
-   <extension
-         id="org.apache.felix.sigil.sigilnature"
-         name="Sigil Nature"
-         point="org.eclipse.core.resources.natures">
-      <runtime>
-         <run class="org.apache.felix.sigil.eclipse.nature.SigilProjectNature"/>
-      </runtime>
-   </extension>
-   <extension
-   		 id="sigilBuilder"
-         name="Sigil Bundle Builder"
-         point="org.eclipse.core.resources.builders">
-      <builder
-            hasNature="false"
-            isConfigurable="false">
-         <run class="org.apache.felix.sigil.eclipse.internal.builders.SigilIncrementalProjectBuilder"/>
-      </builder>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.apache.felix.sigil.eclipse.internal.preferences.SigilPreferencesInitializer">
-      </initializer>
-   </extension>
-   <extension
-         point="org.apache.felix.sigil.repositoryprovider">
-      <provider
-            class="org.apache.felix.sigil.eclipse.internal.repository.eclipse.WorkspaceRepositoryProvider"
-            defaultLevel="-3"
-            dynamic="false"
-            id="org.apache.felix.sigil.core.workspaceprovider"
-            alias="project"
-            type="Workspace Repository">
-      </provider>
-      <provider
-            class="org.apache.felix.sigil.common.core.repository.FileSystemRepositoryProvider"
-            dynamic="true"
-            id="org.apache.felix.sigil.core.file"
-            alias="filesystem"
-            type="File System Repository">
-      </provider>
-      <provider
-            class="org.apache.felix.sigil.common.core.repository.SystemRepositoryProvider"
-            dynamic="false"
-            id="org.apache.felix.sigil.core.system"
-            alias="system"
-            type="System Repository">
-      </provider>
-   </extension>
-   <extension
-         id="org.apache.felix.sigil.unresolvedDependencyMarker"
-         name="Unresolved Dependency"
-         point="org.eclipse.core.resources.markers">
-      <persistent
-            value="true">
-      </persistent>
-      <super
-            type="org.eclipse.core.resources.problemmarker">
-      </super>
-      <attribute
-            name="element">
-      </attribute>
-      <attribute
-            name="versionRange">
-      </attribute>
-   </extension>
-   <extension
-         id="org.apache.felix.sigil.unresolvedDependencyMarker.importPackage"
-         name="Unresolved Import Package"
-         point="org.eclipse.core.resources.markers">
-      <persistent
-            value="true">
-      </persistent>
-      <super
-            type="org.apache.felix.sigil.unresolvedDependencyMarker">
-      </super>
-   </extension>
-   <extension
-         id="org.apache.felix.sigil.unresolvedDependencyMarker.requireBundle"
-         name="Unresolve Require Bundle"
-         point="org.eclipse.core.resources.markers">
-      <persistent
-            value="true">
-      </persistent>
-      <super
-            type="org.apache.felix.sigil.unresolvedDependencyMarker">
-      </super>
-   </extension>
-</plugin>
diff --git a/sigil/eclipse/core/schema/org.apache.felix.sigil.installbuilder.exsd b/sigil/eclipse/core/schema/org.apache.felix.sigil.installbuilder.exsd
deleted file mode 100644
index e6c29c6..0000000
--- a/sigil/eclipse/core/schema/org.apache.felix.sigil.installbuilder.exsd
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.apache.felix.sigil.eclipse.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.apache.felix.sigil.eclipse.core" id="org.apache.felix.sigil.installbuilder" name="OSGi Install Builder"/>
-      </appinfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="builder" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="builder">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn=":org.apache.felix.sigil.eclipse.install.IOSGiInstallBuilder"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="priority" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd b/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd
deleted file mode 100644
index f760d9d..0000000
--- a/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd
+++ /dev/null
@@ -1,147 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.apache.felix.sigil.eclipse.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.apache.felix.sigil.eclipse.core" id="org.apache.felix.sigil.repository" name="Sigil Bundle Repository Provider"/>
-      </appinfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="provider" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="provider">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="alias" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn=":org.apache.felix.sigil.repository.IRepositoryProvider"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="dynamic" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="defaultLevel" type="string" use="default" value="500">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/sigil/eclipse/core/sigil.properties b/sigil/eclipse/core/sigil.properties
deleted file mode 100644
index 44c6d48..0000000
--- a/sigil/eclipse/core/sigil.properties
+++ /dev/null
@@ -1,86 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--activator: org.apache.felix.sigil.eclipse.SigilCore
-
--singleton: true
-
--bundles: \
-	org.apache.felix.sigil.eclipse.core, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-	plugin.xml, \
-	schema, \
-	schema/org.apache.felix.sigil.installbuilder.exsd, \
-	schema/org.apache.felix.sigil.repositoryprovider.exsd, \
-
--sourcedirs: \
-	src, \
-
--exports: \
-	org.apache.felix.sigil.eclipse, \
-	org.apache.felix.sigil.eclipse.install, \
-	org.apache.felix.sigil.eclipse.job, \
-	org.apache.felix.sigil.eclipse.model.project, \
-	org.apache.felix.sigil.eclipse.model.repository, \
-	org.apache.felix.sigil.eclipse.model.util, \
-	org.apache.felix.sigil.eclipse.preferences, \
-	org.apache.felix.sigil.eclipse.repository, \
-
--imports: \
-	org.apache.commons.lang, \
-	org.apache.commons.lang.text, \
-	org.apache.felix.sigil.common.bnd, \
-	org.apache.felix.sigil.common.config, \
-	org.apache.felix.sigil.common.core, \
-	org.apache.felix.sigil.common.core.repository, \
-	org.apache.felix.sigil.common.model, \
-	org.apache.felix.sigil.common.model.eclipse, \
-	org.apache.felix.sigil.common.model.osgi, \
-	org.apache.felix.sigil.common.osgi, \
-	org.apache.felix.sigil.common.progress, \
-	org.apache.felix.sigil.common.repository, \
-	org.apache.felix.sigil.common.util, \
-	org.apache.felix.sigil.eclipse, \
-	org.apache.felix.sigil.eclipse.install, \
-	org.apache.felix.sigil.eclipse.job, \
-	org.apache.felix.sigil.eclipse.model.project, \
-	org.apache.felix.sigil.eclipse.model.repository, \
-	org.apache.felix.sigil.eclipse.model.util, \
-	org.apache.felix.sigil.eclipse.preferences, \
-	org.apache.felix.sigil.utils, \
-	org.eclipse.core.commands.common;resolve=compile, \
-	org.eclipse.core.expressions, \
-	org.eclipse.core.resources, \
-	org.eclipse.core.runtime.content, \
-	org.eclipse.core.runtime.jobs, \
-	org.eclipse.core.runtime.preferences, \
-	org.eclipse.debug.core, \
-	org.eclipse.jdt.core, \
-	org.eclipse.jface.dialogs, \
-	org.eclipse.jface.preference, \
-	org.eclipse.jface.resource, \
-	org.eclipse.jface.util, \
-	org.eclipse.jface.window, \
-	org.eclipse.ui, \
-	org.eclipse.ui.console, \
-	org.eclipse.ui.dialogs, \
-	org.eclipse.ui.plugin, \
-	org.osgi.framework, \
-	org.osgi.service.prefs, \
-	org.osgi.util.tracker, \
-
--requires: \
-	org.eclipse.core.runtime;version=3.4.0, \
-	org.eclipse.equinox.common;version=3.4.0, \
-	org.eclipse.equinox.registry;version=3.4.0, \
-	org.eclipse.swt;version=3.4.2, \
-	org.eclipse.ui.workbench;version=3.4.1, \
-
-header;Bundle-ActivationPolicy: lazy
-
-option;addMissingImports: false
-
-# end
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/PathUtil.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/PathUtil.java
deleted file mode 100644
index 9cea7fd..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/PathUtil.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-/**
- * @author dave
- *
- */
-public class PathUtil
-{
-    /**
-     * @param sourceRootPath
-     * @return
-     */
-    public static IPath newPathIfNotNull(String path)
-    {
-        return path == null ? null : new Path(path);
-    }
-
-    /**
-     * @param absolutePath
-     * @return
-     */
-    public static IPath newPathIfExists(File file)
-    {
-        if (file == null)
-            return null;
-        if (file.exists())
-            return new Path(file.getAbsolutePath());
-        // fine
-        return null;
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java
deleted file mode 100644
index 69cb7a1..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java
+++ /dev/null
@@ -1,589 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Locale;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.apache.felix.sigil.common.config.IBldProject;
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryManager;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-import org.apache.felix.sigil.common.repository.ResolutionConfig;
-import org.apache.felix.sigil.eclipse.install.IOSGiInstallManager;
-import org.apache.felix.sigil.eclipse.internal.install.OSGiInstallManager;
-import org.apache.felix.sigil.eclipse.internal.model.project.SigilModelRoot;
-import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryPreferences;
-import org.apache.felix.sigil.eclipse.internal.repository.manager.GlobalRepositoryManager;
-import org.apache.felix.sigil.eclipse.internal.repository.manager.IEclipseBundleRepository;
-import org.apache.felix.sigil.eclipse.internal.repository.manager.RepositoryCache;
-import org.apache.felix.sigil.eclipse.internal.resources.ProjectResourceListener;
-import org.apache.felix.sigil.eclipse.internal.resources.SigilProjectManager;
-import org.apache.felix.sigil.eclipse.model.project.ISigilModelRoot;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryPreferences;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class SigilCore extends AbstractUIPlugin
-{
-
-    private static final String BASE = "org.apache.felix.sigil";
-    // The plug-in ID
-    public static final String PLUGIN_ID = BASE + ".eclipse.core";
-    public static final String NATURE_ID = BASE + ".sigilnature";
-    public static final String PREFERENCES_ID = BASE
-        + ".ui.preferences.SigilPreferencePage";
-    public static final String OSGI_INSTALLS_PREFERENCES_ID = BASE
-        + ".ui.preferences.osgiInstalls";
-    public static final String EXCLUDED_RESOURCES_PREFERENCES_ID = BASE
-        + ".ui.preferences.excludedResources";
-    public static final String REPOSITORIES_PREFERENCES_ID = BASE
-        + ".ui.preferences.repositoriesPreferencePage";
-    public static final String SIGIL_PROJECT_FILE = IBldProject.PROJECT_FILE;
-    public static final String BUILDER_ID = PLUGIN_ID + ".sigilBuilder";
-    public static final String CLASSPATH_CONTAINER_PATH = BASE + ".classpathContainer";
-
-    public static final String OSGI_INSTALLS = BASE + ".osgi.installs";
-    public static final String OSGI_DEFAULT_INSTALL_ID = BASE
-        + ".osgi.default.install.id";
-    public static final String OSGI_INSTALL_PREFIX = BASE + ".osgi.install.";
-    public static final String OSGI_SOURCE_LOCATION = BASE + ".osgi.source.location";
-    public static final String OSGI_INSTALL_CHECK_PREFERENCE = BASE
-        + ".osgi.install.check";
-    public static final String LIBRARY_KEYS_PREF = BASE + ".library.keys";
-    public static final String PREFERENCES_REBUILD_PROJECTS = BASE + ".rebuild.projects";
-    public static final String QUALIFY_VERSIONS = BASE + ".qualify.versions";
-
-    public static final String DEFAULT_VERSION_LOWER_BOUND = BASE + ".versionLowerBound";
-    public static final String DEFAULT_VERSION_UPPER_BOUND = BASE + ".versionUpperBound";
-
-    public static final String DEFAULT_EXCLUDED_RESOURCES = BASE + ".excludedResources";
-    public static final String INCLUDE_OPTIONAL_DEPENDENCIES = BASE
-        + ".includeOptionalDependencies";
-
-    public static final String INSTALL_BUILDER_EXTENSION_POINT_ID = BASE
-        + ".installbuilder";
-    public static final String REPOSITORY_PROVIDER_EXTENSION_POINT_ID = BASE
-        + ".repositoryprovider";
-
-    public static final String MARKER_UNRESOLVED_DEPENDENCY = BASE
-        + ".unresolvedDependencyMarker";
-    public static final String MARKER_UNRESOLVED_IMPORT_PACKAGE = BASE
-        + ".unresolvedDependencyMarker.importPackage";
-    public static final String MARKER_UNRESOLVED_REQUIRE_BUNDLE = BASE
-        + ".unresolvedDependencyMarker.requireBundle";
-    public static final String REPOSITORY_SET = PLUGIN_ID + ".repository.set";
-
-    public static final String PREFERENCES_NOASK_OSGI_INSTALL = BASE + ".noAskOSGIHome";
-    public static final String PREFERENCES_ADD_IMPORT_FOR_EXPORT = BASE
-        + ".addImportForExport";
-    public static final String PREFERENCES_INCLUDE_OPTIONAL = PLUGIN_ID
-        + ".include.optional";
-    public static final String PREFERENCES_REMOVE_IMPORT_FOR_EXPORT = BASE
-        + ".removeImportForExport";
-
-    // The shared instance
-    private static SigilCore plugin;
-
-    private static RepositoryPreferences repositoryPrefs;
-    private static SigilProjectManager projectManager;
-    private static OSGiInstallManager installs;
-    private static ISigilModelRoot modelRoot;
-    private static GlobalRepositoryManager globalRepositoryManager;
-
-    /**
-     * Returns the shared instance
-     * 
-     * @return the shared instance
-     */
-    public static SigilCore getDefault()
-    {
-        return plugin;
-    }
-
-    public static CoreException newCoreException(String msg, Throwable t)
-    {
-        return new CoreException(makeStatus(msg, t, IStatus.ERROR));
-    }
-
-    public static void log(String msg)
-    {
-        DebugPlugin.log(makeStatus(msg, null, IStatus.INFO));
-    }
-
-    public static void error(String msg)
-    {
-        DebugPlugin.log(makeStatus(msg, null, IStatus.ERROR));
-    }
-
-    public static void error(String msg, Throwable t)
-    {
-        DebugPlugin.log(makeStatus(msg, t, IStatus.ERROR));
-    }
-
-    public static void warn(String msg)
-    {
-        DebugPlugin.log(makeStatus(msg, null, IStatus.WARNING));
-    }
-
-    public static void warn(String msg, Throwable t)
-    {
-        DebugPlugin.log(makeStatus(msg, t, IStatus.WARNING));
-    }
-
-    private static IStatus makeStatus(String msg, Throwable t, int status)
-    {
-        if (t instanceof CoreException)
-        {
-            CoreException c = (CoreException) t;
-            return c.getStatus();
-        }
-        else
-        {
-            return new Status(status, SigilCore.PLUGIN_ID, status, msg, t);
-        }
-    }
-
-    public static boolean isSigilProject(IProject resource)
-    {
-        if (resource == null)
-            return false;
-
-        if (resource.isAccessible() && resource instanceof IProject)
-        {
-            IProject project = (IProject) resource;
-            try
-            {
-                return project.hasNature(NATURE_ID);
-            }
-            catch (CoreException e)
-            {
-                error(e.getMessage(), e);
-                return false;
-            }
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    public static boolean hasProjectNature(IProject project) throws CoreException
-    {
-        return project.getNature(NATURE_ID) != null;
-    }
-
-    public static ResourceBundle getResourceBundle()
-    {
-        return ResourceBundle.getBundle("resources." + SigilCore.class.getName(),
-            Locale.getDefault(), SigilCore.class.getClassLoader());
-    }
-
-    public static ISigilProjectModel create(IProject project) throws CoreException
-    {
-        return projectManager.getSigilProject(project);
-    }
-
-    /**
-     * The constructor
-     */
-    public SigilCore()
-    {
-        plugin = this;
-    }
-
-    public void earlyStartup()
-    {
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext
-     * )
-     */
-    public void start(final BundleContext context) throws Exception
-    {
-        super.start(context);
-
-        RepositoryCache repositoryCache = new RepositoryCache();
-        projectManager = new SigilProjectManager(repositoryCache);
-
-        modelRoot = new SigilModelRoot();
-
-        installs = new OSGiInstallManager();
-
-        repositoryPrefs = new RepositoryPreferences();
-        globalRepositoryManager = new GlobalRepositoryManager(repositoryCache);
-        globalRepositoryManager.initialise();
-
-        registerModelElements(context);
-        registerResourceListeners();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext
-     * )
-     */
-    public void stop(BundleContext context) throws Exception
-    {
-        globalRepositoryManager.destroy();
-        globalRepositoryManager = null;
-        
-        projectManager.destroy();
-        projectManager = null;
-
-        plugin = null;
-
-        super.stop(context);
-    }
-
-    public static boolean isBundledPath(String bp) throws CoreException
-    {
-        boolean bundle = JavaHelper.isCachedBundle(bp);
-
-        if (!bundle)
-        {
-            bundle = isProjectPath(bp);
-
-            if (!bundle)
-            {
-                for (IBundleRepository r : getGlobalRepositoryManager().getRepositories())
-                {
-                    bundle = isBundlePath(bp, r);
-                    if (bundle)
-                        break;
-                }
-            }
-        }
-
-        return bundle;
-    }
-
-    private static boolean isBundlePath(final String bp, IBundleRepository r)
-    {
-        final AtomicBoolean flag = new AtomicBoolean();
-
-        IRepositoryVisitor visitor = new IRepositoryVisitor()
-        {
-            public boolean visit(ISigilBundle b)
-            {
-                File path = b.getLocation();
-                if (path != null && path.getAbsolutePath().equals(bp))
-                {
-                    flag.set(true);
-                    return false;
-                }
-                else
-                {
-                    return true;
-                }
-            }
-
-        };
-
-        r.accept(visitor, ResolutionConfig.INDEXED_ONLY | ResolutionConfig.LOCAL_ONLY);
-
-        return flag.get();
-    }
-
-    private static boolean isProjectPath(String bp) throws CoreException
-    {
-        for (ISigilProjectModel p : SigilCore.getRoot().getProjects())
-        {
-            IPath path = p.findOutputLocation();
-
-            if (path.toOSString().equals(bp))
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private void registerResourceListeners()
-    {
-        Job job = new Job("Initialising sigil resource listeners")
-        {
-            @Override
-            protected IStatus run(IProgressMonitor monitor)
-            {
-                ResourcesPlugin.getWorkspace().addResourceChangeListener(
-                    new ProjectResourceListener(projectManager),
-                    ProjectResourceListener.EVENT_MASKS);
-                return Status.OK_STATUS;
-            }
-        };
-        job.setSystem(true);
-        job.schedule();
-    }
-
-    private void registerModelElements(BundleContext context)
-    {
-        // trick to get eclipse to lazy load BldCore for model elements
-        BldCore.getLicenseManager();
-    }
-
-    public static IOSGiInstallManager getInstallManager()
-    {
-        return installs;
-    }
-
-    public static ISigilModelRoot getRoot()
-    {
-        return modelRoot;
-    }
-
-    public static IRepositoryManager getGlobalRepositoryManager()
-    {
-        return globalRepositoryManager;
-    }
-
-    public static IRepositoryManager getRepositoryManager(ISigilProjectModel model)
-    {
-        if ( model == null ) return globalRepositoryManager;
-        try
-        {
-            return projectManager.getRepositoryManager(model);
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to read repository config", e);
-            return globalRepositoryManager;
-        }        
-    }
-    
-    /**
-     * @param rep
-     * @return
-     */
-    public static IRepositoryModel getRepositoryModel(IBundleRepository rep)
-    {
-        IEclipseBundleRepository cast = (IEclipseBundleRepository) rep;
-        return cast.getModel();
-    }    
-
-    public static IRepositoryPreferences getRepositoryPreferences()
-    {
-        return repositoryPrefs;
-    }
-
-    public static void rebuildAllBundleDependencies(IProgressMonitor monitor)
-    {
-        Collection<ISigilProjectModel> projects = getRoot().getProjects();
-        
-        if (!projects.isEmpty())
-        {
-            SubMonitor progress = SubMonitor.convert(monitor, projects.size() * 20);
-            for (ISigilProjectModel p : projects)
-            {
-                rebuild(p, progress);
-            }
-        }
-
-        monitor.done();
-    }
-
-    public static void rebuildBundleDependencies(ISigilProjectModel project,
-        Collection<ICapabilityModelElement> caps, IProgressMonitor monitor)
-    {
-        Set<ISigilProjectModel> affected = SigilCore.getRoot().resolveDependentProjects(
-            caps, monitor);
-
-        if (project != null)
-        {
-            affected.remove(project);
-        }
-
-        SubMonitor progress = SubMonitor.convert(monitor, affected.size() * 20);
-        for (ISigilProjectModel dependent : affected)
-        {
-            //dependent.flushDependencyState();
-            rebuild(dependent, progress);
-        }
-    }
-
-    public static void rebuild(ISigilProjectModel dependent, SubMonitor progress)
-    {
-        try
-        {
-            dependent.resetClasspath(progress.newChild(10), false);
-            dependent.getProject().build(IncrementalProjectBuilder.FULL_BUILD,
-                progress.newChild(10));
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to rebuild " + dependent, e);
-        }
-    }
-
-    public IPath findDefaultBundleLocation(ISigilProjectModel m) throws CoreException
-    {
-        IPath loc = m.getProject().getLocation();
-        loc = loc.append(m.getJavaModel().getOutputLocation().removeFirstSegments(1));
-        loc = loc.removeLastSegments(1).append("lib");
-        return loc.append(m.getSymbolicName() + ".jar");
-    }
-
-    public static void makeSigilProject(IProject project, IProgressMonitor monitor)
-        throws CoreException
-    {
-        IProjectDescription description = project.getDescription();
-
-        String[] natures = description.getNatureIds();
-        String[] newNatures = new String[natures.length + 1];
-        System.arraycopy(natures, 0, newNatures, 0, natures.length);
-        newNatures[natures.length] = SigilCore.NATURE_ID;
-        description.setNatureIds(newNatures);
-
-        ICommand sigilBuild = description.newCommand();
-        sigilBuild.setBuilderName(SigilCore.BUILDER_ID);
-
-        ICommand javaBuild = description.newCommand();
-        javaBuild.setBuilderName(JavaCore.BUILDER_ID);
-
-        description.setBuildSpec(new ICommand[] { javaBuild, sigilBuild });
-
-        project.setDescription(description, new SubProgressMonitor(monitor, 2));
-
-        IJavaProject java = JavaCore.create(project);
-        if (java.exists())
-        {
-            IClasspathEntry[] cp = java.getRawClasspath();
-            // check if sigil container is already on classpath - if not add it
-            if (!isSigilOnClasspath(cp))
-            {
-                ArrayList<IClasspathEntry> entries = new ArrayList<IClasspathEntry>(
-                    Arrays.asList(cp));
-                entries.add(JavaCore.newContainerEntry(new Path(
-                    SigilCore.CLASSPATH_CONTAINER_PATH)));
-                java.setRawClasspath(
-                    entries.toArray(new IClasspathEntry[entries.size()]), monitor);
-            }
-        }
-    }
-
-    /**
-     * @param cp
-     * @return
-     */
-    private static boolean isSigilOnClasspath(IClasspathEntry[] cp)
-    {
-        for (IClasspathEntry e : cp)
-        {
-            if (e.getEntryKind() == IClasspathEntry.CPE_CONTAINER
-                && e.getPath().segment(0).equals(SigilCore.CLASSPATH_CONTAINER_PATH))
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static Image loadImage(URL url) throws IOException
-    {
-        ImageRegistry registry = getDefault().getImageRegistry();
-
-        String key = url.toExternalForm();
-        Image img = registry.get(key);
-
-        if (img == null)
-        {
-            img = openImage(url);
-            registry.put(key, img);
-        }
-
-        return img;
-    }
-
-    private static Image openImage(URL url) throws IOException
-    {
-        Display display = Display.getCurrent();
-        if (display == null)
-        {
-            display = Display.getDefault();
-        }
-
-        InputStream in = null;
-        try
-        {
-            in = url.openStream();
-            return new Image(display, in);
-        }
-        finally
-        {
-            if (in != null)
-            {
-                try
-                {
-                    in.close();
-                }
-                catch (IOException e)
-                {
-                    error("Failed to close stream", e);
-                }
-            }
-        }
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstall.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstall.java
deleted file mode 100644
index d31cb1f..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstall.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.install;
-
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPath;
-
-/**
- * Encapsulates all information about a particular OSGi install.
- * 
- * @author dave
- *
- */
-public interface IOSGiInstall
-{
-
-    /**
-     * A unique id which can be used to refer to this install within the eclipse runtime.
-     * @return
-     */
-    String getId();
-
-    /**
-     * Where this install is located
-     * @return
-     */
-    IPath getInstallLocation();
-
-    /**
-     * @return
-     */
-    Map<String, String> getProperties();
-
-    /**
-     * @return
-     */
-    String[] getLaunchArguments();
-
-    /**
-     * @return
-     */
-    IPath getVarDirectory();
-
-    /**
-     * @return
-     */
-    IOSGiInstallType getType();
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstallBuilder.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstallBuilder.java
deleted file mode 100644
index 2dd5148..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstallBuilder.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.install;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-
-public interface IOSGiInstallBuilder
-{
-    IOSGiInstall build(String id, IPath path) throws CoreException;
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstallManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstallManager.java
deleted file mode 100644
index 2c304b4..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstallManager.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.install;
-
-public interface IOSGiInstallManager
-{
-    IOSGiInstall findInstall(String id);
-
-    String[] getInstallIDs();
-
-    IOSGiInstall[] getInstalls();
-
-    IOSGiInstall getDefaultInstall();
-
-    IOSGiInstallType findInstallType(String location);
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstallType.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstallType.java
deleted file mode 100644
index be117e6..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/IOSGiInstallType.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.install;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.swt.graphics.Image;
-
-//import org.eclipse.swt.graphics.Image;
-
-public interface IOSGiInstallType
-{
-    /**
-     * @return
-     */
-    String getName();
-
-    /**
-     * 
-     * @return
-     */
-    String getVersion();
-
-    /**
-     * @return
-     */
-    String getMainClass();
-
-    /**
-     * @return
-     */
-    String[] getClassPath();
-
-    /**
-     * @return
-     */
-    IPath getSourceLocation();
-
-    /**
-     * @return
-     */
-    IPath getJavaDocLocation();
-
-    /**
-     * Return the paths of any bundles that are started by default in this OSGi instance.
-     * @return
-     */
-    IPath[] getDefaultBundleLocations();
-
-    String getId();
-
-    Image getIcon();
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/OSGiInstall.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/OSGiInstall.java
deleted file mode 100644
index 7b98c2c..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/OSGiInstall.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.install;
-
-import java.util.Arrays;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPath;
-
-public class OSGiInstall implements IOSGiInstall
-{
-
-    private String id;
-    private IPath installLocation;
-    private String[] launchArgs;
-    private Map<String, String> properties;
-    private IPath varDirectory;
-    private IOSGiInstallType type;
-
-    public IPath getVarDirectory()
-    {
-        return varDirectory;
-    }
-
-    public void setVarDirectory(IPath varDirectory)
-    {
-        this.varDirectory = varDirectory;
-    }
-
-    public OSGiInstall(String id)
-    {
-        this.id = id;
-    }
-
-    public String getId()
-    {
-        return id;
-    }
-
-    public IPath getInstallLocation()
-    {
-        return installLocation;
-    }
-
-    public void setInstallLocation(IPath installLocation)
-    {
-        this.installLocation = installLocation;
-    }
-
-    public String[] getLaunchArguments()
-    {
-        return launchArgs;
-    }
-
-    public void setLaunchArguments(String[] launchArgs)
-    {
-        this.launchArgs = launchArgs;
-    }
-
-    public Map<String, String> getProperties()
-    {
-        return properties;
-    }
-
-    public void setProperties(Map<String, String> properties)
-    {
-        this.properties = properties;
-    }
-
-    public String toString()
-    {
-        return "OSGiInstall[\n" + "id=" + id + "\n" + "type=" + type + "\n"
-            + "installLocation=" + installLocation + "\n" + "launchArgs="
-            + Arrays.asList(launchArgs) + "\n" + "properties=" + properties + "\n" + "]";
-    }
-
-    public IOSGiInstallType getType()
-    {
-        return type;
-    }
-
-    public void setType(IOSGiInstallType type)
-    {
-        this.type = type;
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/OSGiInstallType.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/OSGiInstallType.java
deleted file mode 100644
index 63c4ffe..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/install/OSGiInstallType.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.install;
-
-import java.util.Arrays;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.swt.graphics.Image;
-
-public class OSGiInstallType implements IOSGiInstallType
-{
-
-    private String id;
-    private String name;
-    private String version;
-    private String mainClass;
-    private String[] classPath;
-    private IPath javaDocLocation;
-    private IPath sourceLocation;
-    private IPath[] defaultBundleLocations;
-    private Image icon;
-
-    public Image getIcon()
-    {
-        return icon;
-    }
-
-    public void setIcon(Image icon)
-    {
-        this.icon = icon;
-    }
-
-    public String getId()
-    {
-        return id;
-    }
-
-    public String[] getClassPath()
-    {
-        return classPath;
-    }
-
-    public IPath[] getDefaultBundleLocations()
-    {
-        return defaultBundleLocations;
-    }
-
-    public IPath getJavaDocLocation()
-    {
-        return javaDocLocation;
-    }
-
-    public String getMainClass()
-    {
-        return mainClass;
-    }
-
-    public String getName()
-    {
-        return name;
-    }
-
-    public IPath getSourceLocation()
-    {
-        return sourceLocation;
-    }
-
-    public String getVersion()
-    {
-        return version;
-    }
-
-    public void setId(String id)
-    {
-        this.id = id;
-    }
-
-    public void setName(String name)
-    {
-        this.name = name;
-    }
-
-    public void setVersion(String version)
-    {
-        this.version = version;
-    }
-
-    public void setMainClass(String mainClass)
-    {
-        this.mainClass = mainClass;
-    }
-
-    public void setClassPath(String[] classPath)
-    {
-        this.classPath = classPath;
-    }
-
-    public void setJavaDocLocation(IPath javaDocLocation)
-    {
-        this.javaDocLocation = javaDocLocation;
-    }
-
-    public void setSourceLocation(IPath sourceLocation)
-    {
-        this.sourceLocation = sourceLocation;
-    }
-
-    public void setDefaultBundleLocations(IPath[] defaultBundleLocations)
-    {
-        this.defaultBundleLocations = defaultBundleLocations;
-    }
-
-    public String toString()
-    {
-        return "OSGiInstallType[\n" + "name=" + name + "\n" + "version=" + version + "\n"
-            + "mainClass=" + mainClass + "\n" + "classPath=" + Arrays.asList(classPath)
-            + "\n" + "javaDocLocation=" + javaDocLocation + "\n" + "sourceLocation="
-            + sourceLocation + "\n" + "defaultBundleLocations="
-            + Arrays.asList(defaultBundleLocations) + "\n" + "]";
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/adapter/FileAdaptorFactory.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/adapter/FileAdaptorFactory.java
deleted file mode 100644
index 283984c..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/adapter/FileAdaptorFactory.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.adapter;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.ModelElementFactoryException;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterFactory;
-
-/**
- * @author savage
- *
- */
-public class FileAdaptorFactory implements IAdapterFactory
-{
-
-    public FileAdaptorFactory()
-    {
-
-    }
-
-    private Class<?>[] types = new Class<?>[] { ISigilBundle.class };
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-     */
-    @SuppressWarnings("unchecked")
-    public Object getAdapter(Object adaptableObject, Class adapterType)
-    {
-        Object adapted = null;
-
-        IFile file = (IFile) adaptableObject;
-
-        if (ISigilBundle.class.equals(adapterType))
-        {
-            adapted = adaptBundle(file);
-        }
-
-        return adapted;
-    }
-
-    private Object adaptBundle(IFile file)
-    {
-        Object adapted = null;
-        IProject project = file.getProject();
-        try
-        {
-            if (SigilCore.hasProjectNature(project))
-            {
-                ISigilProjectModel sigil = SigilCore.create(project);
-                ISigilBundle bundle = ModelElementFactory.getInstance().newModelElement(
-                    ISigilBundle.class);
-                bundle.setParent(sigil);
-                adapted = bundle;
-            }
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to construct bundle", e);
-        }
-        catch (ModelElementFactoryException e)
-        {
-            SigilCore.error("Failed to construct bundle", e);
-        }
-
-        return adapted;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-     */
-    @SuppressWarnings("unchecked")
-    public Class[] getAdapterList()
-    {
-        return types;
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/adapter/ProjectAdaptorFactory.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/adapter/ProjectAdaptorFactory.java
deleted file mode 100644
index ea805cd..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/adapter/ProjectAdaptorFactory.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.adapter;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterFactory;
-
-/**
- * @author savage
- *
- */
-public class ProjectAdaptorFactory implements IAdapterFactory
-{
-
-    private Class<?>[] types = new Class<?>[] { ISigilProjectModel.class };
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-     */
-    @SuppressWarnings("unchecked")
-    public Object getAdapter(Object adaptableObject, Class adapterType)
-    {
-        Object adapted = null;
-
-        IProject project = (IProject) adaptableObject;
-
-        if (ISigilProjectModel.class.equals(adapterType))
-        {
-            adapted = adaptProject(project);
-        }
-
-        return adapted;
-    }
-
-    private Object adaptProject(IProject project)
-    {
-        try
-        {
-            if (SigilCore.isSigilProject(project))
-            {
-                return SigilCore.create(project);
-            }
-        }
-        catch (CoreException e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-     */
-    @SuppressWarnings("unchecked")
-    public Class[] getAdapterList()
-    {
-        return types;
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/builders/BuildConsole.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/builders/BuildConsole.java
deleted file mode 100644
index 9f3eba0..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/builders/BuildConsole.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.builders;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.console.MessageConsole;
-import org.eclipse.ui.console.MessageConsoleStream;
-
-public class BuildConsole extends MessageConsole
-{
-
-    private static final ImageDescriptor imageDescriptor = null;
-    private MessageConsoleStream stream;
-
-    public BuildConsole()
-    {
-        super("Sigil Build", imageDescriptor, true);
-    }
-
-    public synchronized MessageConsoleStream getMessageStream()
-    {
-        if (stream == null)
-        {
-            stream = newMessageStream();
-        }
-        return stream;
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/builders/SigilIncrementalProjectBuilder.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/builders/SigilIncrementalProjectBuilder.java
deleted file mode 100644
index baf86a0..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/builders/SigilIncrementalProjectBuilder.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.builders;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.bnd.BundleBuilder;
-import org.apache.felix.sigil.common.config.IBldProject;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaModelMarker;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleManager;
-import org.eclipse.ui.console.MessageConsoleStream;
-
-public class SigilIncrementalProjectBuilder extends IncrementalProjectBuilder
-{
-    @Override
-    protected IProject[] build(int kind, @SuppressWarnings("unchecked") Map args,
-        IProgressMonitor monitor) throws CoreException
-    {
-        IProject project = getProject();
-
-        if (checkOk(project))
-        {
-            switch (kind)
-            {
-                case CLEAN_BUILD:
-                case FULL_BUILD:
-                    fullBuild(project, monitor);
-                    break;
-                case AUTO_BUILD:
-                case INCREMENTAL_BUILD:
-                    autoBuild(project, monitor);
-                    break;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * @param install
-     * @param project
-     * @param monitor
-     * @throws CoreException 
-     */
-    private void autoBuild(IProject project, IProgressMonitor monitor)
-        throws CoreException
-    {
-        IResourceDelta delta = getDelta(project);
-        final boolean[] changed = new boolean[1];
-        ISigilProjectModel sigil = SigilCore.create(project);
-        final IPath bldRoot = sigil.findBundleLocation().removeLastSegments(1);
-
-        delta.accept(new IResourceDeltaVisitor()
-        {
-            public boolean visit(IResourceDelta delta) throws CoreException
-            {
-                if (!changed[0])
-                {
-                    IResource res = delta.getResource();
-                    if (res.getType() == IResource.FILE)
-                    {
-                        changed[0] = !bldRoot.isPrefixOf(res.getLocation());
-                    }
-                }
-                return !changed[0];
-            }
-        });
-
-        if (changed[0])
-        {
-            doBuild(project, monitor);
-        }
-    }
-
-    /**
-     * @param install
-     * @param project
-     * @param monitor
-     * @throws CoreException 
-     */
-    private void fullBuild(IProject project, IProgressMonitor monitor)
-        throws CoreException
-    {
-        doBuild(project, monitor);
-    }
-
-    private boolean checkOk(IProject project) throws CoreException
-    {
-        IMarker[] markers = project.findMarkers(
-            IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
-
-        for (IMarker m : markers)
-        {
-            Integer s = (Integer) m.getAttribute(IMarker.SEVERITY);
-            if (s != null && s.equals(IMarker.SEVERITY_ERROR))
-            {
-                SigilCore.log("Skipping " + project.getName()
-                    + " build due to unresolved errors");
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    private void doBuild(IProject project, IProgressMonitor monitor) throws CoreException
-    {
-        ISigilProjectModel sigil = SigilCore.create(project);
-        IBldProject bld = sigil.getBldProject();
-
-        File[] classpath = buildClasspath(sigil, monitor);
-
-        String destPattern = buildDestPattern(sigil);
-
-        Properties env = new Properties();
-
-        BundleBuilder bb = new BundleBuilder(bld, classpath, destPattern, env);
-
-        for (IBldProject.IBldBundle bundle : bld.getBundles())
-        {
-            String id = bundle.getId();
-            loginfo("creating bundle: " + id);
-            int nWarn = 0;
-            int nErr = 0;
-            String msg = "";
-
-            try
-            {
-                boolean modified = bb.createBundle(bundle, false, new BundleBuilder.Log()
-                {
-                    public void warn(String msg)
-                    {
-                        logwarn(msg);
-                    }
-
-                    public void verbose(String msg)
-                    {
-                        loginfo(msg);
-                    }
-                });
-                nWarn = bb.warnings().size();
-                if (!modified)
-                {
-                    msg = " (not modified)";
-                }
-            }
-            catch (Exception e)
-            {
-                List<String> errors = bb.errors();
-                if (errors != null)
-                {
-                    nErr = errors.size();
-                    for (String err : errors)
-                    {
-                        logerror(err);
-                    }
-                }
-                // FELIX-1690 - error is already logged no need to throw error as this
-                // results in noisy error dialog box
-                //throw SigilCore.newCoreException( "Failed to create: " + id + ": " + e, e );
-            }
-            finally
-            {
-                loginfo(id + ": " + count(nErr, "error") + ", " + count(nWarn, "warning")
-                    + msg);
-            }
-        }
-    }
-
-    private static void loginfo(String message)
-    {
-        log("INFO: " + message);
-    }
-
-    private static void logwarn(String message)
-    {
-        log("WARN: " + message);
-    }
-
-    private static void logerror(String message)
-    {
-        log("ERROR: " + message);
-    }
-
-    private static void log(final String message)
-    {
-        // do this in background to avoid deadlock with ui 
-        Job job = new Job("log")
-        {
-            @Override
-            protected IStatus run(IProgressMonitor arg0)
-            {
-                BuildConsole console = findConsole();
-                MessageConsoleStream stream = console.getMessageStream();
-                stream.println(message);
-                return Status.OK_STATUS;
-            }
-        };
-        job.schedule();
-    }
-
-    private static BuildConsole findConsole()
-    {
-        BuildConsole console = null;
-
-        IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
-
-        for (IConsole c : manager.getConsoles())
-        {
-            if (c instanceof BuildConsole)
-            {
-                console = (BuildConsole) c;
-                break;
-            }
-        }
-
-        if (console == null)
-        {
-            console = new BuildConsole();
-            manager.addConsoles(new IConsole[] { console });
-        }
-
-        return console;
-    }
-
-    private String buildDestPattern(ISigilProjectModel sigil) throws CoreException
-    {
-        IPath loc = sigil.findBundleLocation().removeLastSegments(1);
-
-        loc.toFile().mkdirs();
-
-        return loc.toOSString() + File.separator + "[name].jar";
-    }
-
-    private File[] buildClasspath(ISigilProjectModel sigil, IProgressMonitor monitor)
-        throws CoreException
-    {
-        LinkedList<File> files = new LinkedList<File>();
-        if (sigil.getBundle().getClasspathEntrys().isEmpty())
-        {
-            IClasspathEntry[] entries = sigil.getJavaModel().getResolvedClasspath(true);
-            for (IClasspathEntry cp : entries)
-            {
-                convert(cp, sigil, files);
-            }
-        }
-        else
-        {
-            buildLocalClasspath(sigil, files);
-            buildExternalClasspath(sigil, files, monitor);
-        }
-        return files.toArray(new File[files.size()]);
-    }
-
-    private void buildExternalClasspath(ISigilProjectModel sigil, List<File> files,
-        IProgressMonitor monitor) throws CoreException
-    {
-        Collection<IClasspathEntry> entries = sigil.findExternalClasspath(monitor);
-
-        for (IClasspathEntry cp : entries)
-        {
-            convert(cp, sigil, files);
-        }
-    }
-
-    private void buildLocalClasspath(ISigilProjectModel sigil, List<File> files)
-        throws CoreException
-    {
-        Collection<IClasspathEntry> entries = JavaHelper.findClasspathEntries(sigil.getBundle());
-        for (IClasspathEntry cp : entries)
-        {
-            convert(cp, sigil, files);
-        }
-    }
-
-    private void convert(IClasspathEntry cp, ISigilProjectModel sigil, List<File> files)
-        throws CoreException
-    {
-        switch (cp.getEntryKind())
-        {
-            case IClasspathEntry.CPE_PROJECT:
-            {
-                convertProject(cp, files);
-                break;
-            }
-            case IClasspathEntry.CPE_SOURCE:
-            {
-                convertSource(sigil, cp, files);
-                break;
-            }
-            case IClasspathEntry.CPE_LIBRARY:
-            {
-                convertLibrary(sigil, cp, files);
-                break;
-            }
-            case IClasspathEntry.CPE_VARIABLE:
-                convertVariable(cp, files);
-                break;
-        }
-    }
-
-    private void convertVariable(IClasspathEntry cp, List<File> files)
-    {
-        cp = JavaCore.getResolvedClasspathEntry(cp);
-        if (cp != null)
-        {
-            IPath p = cp.getPath();
-            files.add(p.toFile());
-        }
-    }
-
-    private void convertLibrary(ISigilProjectModel sigil, IClasspathEntry cp,
-        List<File> files)
-    {
-        IPath p = cp.getPath();
-
-        IProject project = sigil.getProject().getWorkspace().getRoot().getProject(
-            p.segment(0));
-        if (project.exists())
-        {
-            p = project.getLocation().append(p.removeFirstSegments(1));
-        }
-
-        files.add(p.toFile());
-    }
-
-    private void convertSource(ISigilProjectModel sigil, IClasspathEntry cp,
-        List<File> files) throws JavaModelException
-    {
-        IPath path = cp.getOutputLocation() == null ? sigil.getJavaModel().getOutputLocation()
-            : cp.getOutputLocation();
-        IFolder buildFolder = sigil.getProject().getFolder(path.removeFirstSegments(1));
-        if (buildFolder.exists())
-        {
-            files.add(buildFolder.getLocation().toFile());
-        }
-    }
-
-    private void convertProject(IClasspathEntry cp, List<File> files)
-        throws CoreException
-    {
-        IProject p = findProject(cp.getPath());
-        ISigilProjectModel project = SigilCore.create(p);
-        if (project.getBundle().getClasspathEntrys().isEmpty())
-        {
-            // ew this is pretty messy - if a dependent bundle specifies it's dependencies
-            // via package statements vs source directories then we need to add
-            // the classpath path of that bundle
-            for (IClasspathEntry rp : project.getJavaModel().getResolvedClasspath(true))
-            {
-                convert(rp, project, files);
-            }
-        }
-        else
-        {
-            for (String scp : project.getBundle().getClasspathEntrys())
-            {
-                IClasspathEntry jcp = project.getJavaModel().decodeClasspathEntry(scp);
-                convert(jcp, project, files);
-            }
-        }
-    }
-
-    private IProject findProject(IPath path) throws CoreException
-    {
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-        for (IProject p : root.getProjects())
-        {
-            IPath projectPath = p.getFullPath();
-            if (projectPath.equals(path))
-            {
-                return p;
-            }
-        }
-
-        throw SigilCore.newCoreException("No such project " + path, null);
-    }
-
-    private String count(int count, String msg)
-    {
-        return count + " " + msg + (count == 1 ? "" : "s");
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/install/OSGiInstallManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/install/OSGiInstallManager.java
deleted file mode 100644
index e50dbf8..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/install/OSGiInstallManager.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.install;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.install.IOSGiInstall;
-import org.apache.felix.sigil.eclipse.install.IOSGiInstallBuilder;
-import org.apache.felix.sigil.eclipse.install.IOSGiInstallManager;
-import org.apache.felix.sigil.eclipse.install.IOSGiInstallType;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-
-public class OSGiInstallManager implements IOSGiInstallManager, IPropertyChangeListener
-{
-    private static final int NORMAL_PRIORITY = 0;
-
-    private LinkedList<IOSGiInstallBuilder> builders = new LinkedList<IOSGiInstallBuilder>();
-
-    private HashMap<IPath, IOSGiInstall> pathToinstall = new HashMap<IPath, IOSGiInstall>();
-    private HashMap<String, IOSGiInstall> idToInstall = new HashMap<String, IOSGiInstall>();
-
-    private String defaultId;
-
-    private boolean initialised;
-
-    public IOSGiInstall findInstall(String id)
-    {
-        init();
-        return idToInstall.get(id);
-    }
-
-    public String[] getInstallIDs()
-    {
-        init();
-        return idToInstall.keySet().toArray(new String[idToInstall.size()]);
-    }
-
-    public IOSGiInstall[] getInstalls()
-    {
-        init();
-        return idToInstall.values().toArray(new IOSGiInstall[idToInstall.size()]);
-    }
-
-    public IOSGiInstall getDefaultInstall()
-    {
-        init();
-        return findInstall(defaultId);
-    }
-
-    public IOSGiInstallType findInstallType(String location)
-    {
-        IOSGiInstallType type = null;
-
-        try
-        {
-            IOSGiInstall install = buildInstall("tmp", new Path(location));
-            type = install == null ? null : install.getType();
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to build install", e);
-        }
-
-        return type;
-    }
-
-    public void propertyChange(PropertyChangeEvent event)
-    {
-        synchronized (this)
-        {
-            if (event.getProperty().equals(SigilCore.OSGI_INSTALLS))
-            {
-                clearInstalls();
-                String val = (String) event.getNewValue();
-                addInstalls(val);
-            }
-            else if (event.getProperty().equals(SigilCore.OSGI_DEFAULT_INSTALL_ID))
-            {
-                defaultId = (String) event.getNewValue();
-            }
-        }
-    }
-
-    private void init()
-    {
-        boolean show = false;
-
-        IPreferenceStore prefs = getPreferenceStore();
-
-        synchronized (this)
-        {
-            if (!initialised)
-            {
-                initialised = true;
-
-                prefs.addPropertyChangeListener(this);
-
-                String val = prefs.getString(SigilCore.OSGI_INSTALLS);
-
-                boolean noAsk = prefs.getBoolean(SigilCore.PREFERENCES_NOASK_OSGI_INSTALL);
-                if (val == null || val.trim().length() == 0)
-                {
-                    show = !noAsk;
-                }
-                else
-                {
-                    addInstalls(val);
-                    defaultId = prefs.getString(SigilCore.OSGI_DEFAULT_INSTALL_ID);
-                }
-            }
-        }
-
-        if (show)
-        {
-            showInstallPrefs(prefs);
-        }
-    }
-
-    private void addInstalls(String prop)
-    {
-        if (prop != null && prop.trim().length() > 0)
-        {
-            IPreferenceStore prefs = getPreferenceStore();
-
-            for (String id : prop.split(","))
-            {
-                String path = prefs.getString(SigilCore.OSGI_INSTALL_PREFIX + id);
-                addInstall(id, new Path(path));
-            }
-        }
-    }
-
-    private IPreferenceStore getPreferenceStore()
-    {
-        return SigilCore.getDefault().getPreferenceStore();
-    }
-
-    private void showInstallPrefs(final IPreferenceStore prefs)
-    {
-        Runnable r = new Runnable()
-        {
-            public void run()
-            {
-                MessageDialogWithToggle questionDialog = MessageDialogWithToggle.openYesNoQuestion(
-                    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
-                    "Sigil Configuration",
-                    "Missing OSGi installation. Open preferences to configure it now?",
-                    "Do not show this message again", false, null, null);
-                prefs.setValue(SigilCore.PREFERENCES_NOASK_OSGI_INSTALL,
-                    questionDialog.getToggleState());
-                if (questionDialog.getReturnCode() == IDialogConstants.YES_ID)
-                {
-                    PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(
-                        null, SigilCore.OSGI_INSTALLS_PREFERENCES_ID, null, null);
-                    dialog.open();
-                }
-            }
-        };
-        Display d = Display.getCurrent();
-        if (d == null)
-        {
-            d = Display.getDefault();
-            d.asyncExec(r);
-        }
-        else
-        {
-            d.syncExec(r);
-        }
-    }
-
-    private IOSGiInstall addInstall(String id, IPath path)
-    {
-        IOSGiInstall install = pathToinstall.get(path);
-
-        if (install == null)
-        {
-            try
-            {
-                install = buildInstall(id, path);
-                if (install != null)
-                {
-                    pathToinstall.put(path, install);
-                    idToInstall.put(install.getId(), install);
-                }
-            }
-            catch (CoreException e)
-            {
-                SigilCore.error("Failed to build install for " + path, e);
-            }
-        }
-
-        return install;
-    }
-
-    private IOSGiInstall buildInstall(String id, IPath path) throws CoreException
-    {
-        initBuilders();
-        IOSGiInstall install = null;
-
-        for (IOSGiInstallBuilder b : builders)
-        {
-            install = b.build(id, path);
-
-            if (install != null)
-            {
-                break;
-            }
-        }
-
-        return install;
-    }
-
-    private void clearInstalls()
-    {
-        idToInstall.clear();
-        pathToinstall.clear();
-    }
-
-    private void initBuilders()
-    {
-        synchronized (builders)
-        {
-            if (builders.isEmpty())
-            {
-                final HashMap<IOSGiInstallBuilder, Integer> tmp = new HashMap<IOSGiInstallBuilder, Integer>();
-
-                IExtensionRegistry registry = Platform.getExtensionRegistry();
-                IExtensionPoint p = registry.getExtensionPoint(SigilCore.INSTALL_BUILDER_EXTENSION_POINT_ID);
-                for (IExtension e : p.getExtensions())
-                {
-                    for (IConfigurationElement c : e.getConfigurationElements())
-                    {
-                        createBuilderFromElement(c, tmp);
-                    }
-                }
-
-                builders = new LinkedList<IOSGiInstallBuilder>(tmp.keySet());
-                Collections.sort(builders, new Comparator<IOSGiInstallBuilder>()
-                {
-                    public int compare(IOSGiInstallBuilder o1, IOSGiInstallBuilder o2)
-                    {
-                        int p1 = tmp.get(o1);
-                        int p2 = tmp.get(o2);
-
-                        if (p1 == p2)
-                        {
-                            return 0;
-                        }
-                        else if (p1 > p2)
-                        {
-                            return -1;
-                        }
-                        else
-                        {
-                            return 1;
-                        }
-                    }
-                });
-            }
-        }
-    }
-
-    private void createBuilderFromElement(IConfigurationElement c,
-        Map<IOSGiInstallBuilder, Integer> builder)
-    {
-        try
-        {
-            IOSGiInstallBuilder b = (IOSGiInstallBuilder) c.createExecutableExtension("class");
-            int priority = parsePriority(c);
-            builder.put(b, priority);
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to create builder", e);
-        }
-    }
-
-    private int parsePriority(IConfigurationElement c)
-    {
-        String str = c.getAttribute("priority");
-
-        if (str == null)
-        {
-            return NORMAL_PRIORITY;
-        }
-        else
-        {
-            return Integer.parseInt(str);
-        }
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java
deleted file mode 100644
index 97fe428..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.model.project;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.common.model.IRequirementModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ILibrary;
-import org.apache.felix.sigil.common.model.eclipse.ILibraryImport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilModelRoot;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-public class SigilModelRoot implements ISigilModelRoot
-{
-    public List<ISigilProjectModel> getProjects()
-    {
-        IProject[] all = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-        ArrayList<ISigilProjectModel> projects = new ArrayList<ISigilProjectModel>(
-            all.length);
-        for (IProject p : all)
-        {
-            try
-            {
-                if (p.isOpen() && p.hasNature(SigilCore.NATURE_ID))
-                {
-                    ISigilProjectModel n = SigilCore.create(p);
-                    projects.add(n);
-                }
-            }
-            catch (CoreException e)
-            {
-                SigilCore.error("Failed to build model element", e);
-            }
-        }
-
-        return projects;
-    }
-
-    public Set<ISigilProjectModel> resolveDependentProjects(
-        Collection<ICapabilityModelElement> caps, IProgressMonitor monitor)
-    {
-        final HashSet<ISigilProjectModel> dependents = new HashSet<ISigilProjectModel>();
-
-        for (final ISigilProjectModel n : getProjects())
-        {
-            for (final ICapabilityModelElement cap : caps)
-            {
-                final ISigilProjectModel sigil = cap.getAncestor(ISigilProjectModel.class);
-
-                n.visit(new IModelWalker()
-                {
-                    public boolean visit(IModelElement element)
-                    {
-                        if (element instanceof IRequirementModelElement)
-                        {
-                            IRequirementModelElement req = (IRequirementModelElement) element;
-                            if (req.accepts(cap))
-                            {
-                                dependents.add(n);
-                                return false;
-                            }
-                        }
-                        else if (element instanceof ILibraryImport)
-                        {
-                            ILibraryImport l = (ILibraryImport) element;
-                            ILibrary lib = sigil.getRepositoryManager().resolveLibrary(
-                                l);
-
-                            if (lib != null)
-                            {
-                                for (IPackageImport i : lib.getImports())
-                                {
-                                    if (i.accepts(cap))
-                                    {
-                                        dependents.add(n);
-                                    }
-                                }
-                            }
-                            else
-                            {
-                                SigilCore.error("No library found for " + l);
-                            }
-                        }
-                        return true;
-                    }
-                });
-            }
-            //            if ( !sigil.equals( n ) )
-            //            {
-            //                for ( IPackageExport pe : sigil.getBundle().getBundleInfo().getExports() )
-            //                {
-            //                    for ( IPackageImport i : n.getBundle().getBundleInfo().getImports() )
-            //                    {
-            //                        if ( pe.getPackageName().equals( i.getPackageName() )
-            //                            && i.getVersions().contains( pe.getVersion() ) )
-            //                        {
-            //                            dependents.add( n );
-            //                        }
-            //                    }
-            //
-            //                    for ( ILibraryImport l : n.getBundle().getBundleInfo().getLibraryImports() )
-            //                    {
-            //                        ILibrary lib = SigilCore.getRepositoryManager( sigil ).resolveLibrary( l );
-            //
-            //                        if ( lib != null )
-            //                        {
-            //                            for ( IPackageImport i : lib.getImports() )
-            //                            {
-            //                                if ( pe.getPackageName().equals( i.getPackageName() )
-            //                                    && i.getVersions().contains( pe.getVersion() ) )
-            //                                {
-            //                                    dependents.add( n );
-            //                                }
-            //                            }
-            //                        }
-            //                        else
-            //                        {
-            //                            SigilCore.error( "No library found for " + l );
-            //                        }
-            //                    }
-            //                }
-            //
-            //                for ( IRequiredBundle r : n.getBundle().getBundleInfo().getRequiredBundles() )
-            //                {
-            //                    if ( sigil.getSymbolicName().equals( r.getSymbolicName() )
-            //                        && r.getVersions().contains( sigil.getVersion() ) )
-            //                    {
-            //                        dependents.add( n );
-            //                    }
-            //                }
-            //            }
-        }
-
-        return dependents;
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
deleted file mode 100644
index b4a759c..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
+++ /dev/null
@@ -1,731 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.model.project;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Matcher;
-
-import org.apache.felix.sigil.common.config.BldFactory;
-import org.apache.felix.sigil.common.config.IBldProject;
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.common.model.AbstractCompoundModelElement;
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.common.model.IRequirementModelElement;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.repository.IRepositoryManager;
-import org.apache.felix.sigil.common.repository.IResolution;
-import org.apache.felix.sigil.common.repository.ResolutionConfig;
-import org.apache.felix.sigil.common.repository.ResolutionException;
-import org.apache.felix.sigil.eclipse.PathUtil;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.job.ThreadProgressMonitor;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.apache.felix.sigil.eclipse.progress.ProgressAdapter;
-import org.apache.felix.sigil.eclipse.repository.ResolutionMonitorAdapter;
-import org.apache.felix.sigil.utils.GlobCompiler;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.jdt.core.ClasspathContainerInitializer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IParent;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.osgi.framework.Version;
-
-/**
- * @author dave
- *
- */
-public class SigilProject extends AbstractCompoundModelElement implements ISigilProjectModel
-{
-
-    private static final long serialVersionUID = 1L;
-
-    private IFile bldProjectFile;
-    private IProject project;
-    private IBldProject bldProject;
-
-    private ISigilBundle bundle;
-
-    private List<IRequirementModelElement> lastReqs = new LinkedList<IRequirementModelElement>();
-    private List<ICapabilityModelElement> lastCaps = new LinkedList<ICapabilityModelElement>();
-
-    public SigilProject()
-    {
-        super("Sigil Project");
-    }
-
-    public SigilProject(IProject project) throws CoreException
-    {
-        this();
-        this.project = project;
-        bldProjectFile = project.getFile(new Path(SigilCore.SIGIL_PROJECT_FILE));
-    }
-
-    public void save(IProgressMonitor monitor) throws CoreException
-    {
-        save(monitor, true);
-    }
-
-    public void save(IProgressMonitor monitor, boolean rebuildDependencies)
-        throws CoreException
-    {
-        SubMonitor progress = SubMonitor.convert(monitor, 1000);
-
-        if (bldProjectFile.getLocation().toFile().exists())
-        {
-            bldProjectFile.setContents(buildContents(), IFile.KEEP_HISTORY,
-                progress.newChild(10));
-        }
-        else
-        {
-            bldProjectFile.create(buildContents(), true /* force */,
-                progress.newChild(5));
-            project.refreshLocal(IResource.DEPTH_ONE, progress.newChild(5));
-        }
-
-        if (rebuildDependencies)
-        {
-            rebuildDependencies(progress.newChild(900));
-        }
-    }
-
-    public void rebuildDependencies(IProgressMonitor monitor) throws CoreException
-    {
-        SubMonitor progress = SubMonitor.convert(monitor, 1000);
-
-        HashSet<ICapabilityModelElement> changes = new HashSet<ICapabilityModelElement>(
-            lastCaps);
-
-        LinkedList<IRequirementModelElement> reqs = new LinkedList<IRequirementModelElement>();
-        LinkedList<ICapabilityModelElement> caps = new LinkedList<ICapabilityModelElement>();
-
-        checkChanges(progress.newChild(100), reqs, caps);
-
-        boolean reqsChanged;
-        boolean capsChanged;
-
-        synchronized (this)
-        {
-            reqsChanged = isRequirementsChanged(reqs);
-            capsChanged = isCapabilitiesChanged(caps);
-        }
-
-        if (reqsChanged)
-        {
-            processRequirementsChanges(progress.newChild(600));
-            SigilCore.rebuild(this, progress.newChild(50));
-        }
-
-        progress.setWorkRemaining(250);
-
-        if (capsChanged)
-        {
-            changes.addAll(caps);
-            SigilCore.rebuildBundleDependencies(this, changes, progress.newChild(250));
-        }
-    }
-
-    public void flushDependencyState()
-    {
-        synchronized (this)
-        {
-            lastReqs.clear();
-        }
-    }
-
-    private void processRequirementsChanges(IProgressMonitor monitor)
-        throws CoreException
-    {
-        SubMonitor progress = SubMonitor.convert(monitor, 100);
-
-        IRepositoryManager manager = getRepositoryManager();
-        ResolutionConfig config = new ResolutionConfig(ResolutionConfig.INCLUDE_OPTIONAL
-            | ResolutionConfig.IGNORE_ERRORS);
-
-        try
-        {
-            IResolution resolution = manager.getBundleResolver().resolve(this, config,
-                new ResolutionMonitorAdapter(progress.newChild(20)));
-
-            markProblems(resolution);
-
-            // pull remote bundles from repositories to be added to classpath
-            if (!resolution.isSynchronized())
-            {
-                resolution.synchronize(new ProgressAdapter(progress.newChild(80)));
-            }
-        }
-        catch (ResolutionException e)
-        {
-            throw SigilCore.newCoreException("Failed to resolve dependencies", e);
-        }
-    }
-
-    private void markProblems(IResolution resolution)
-    {
-        try
-        {
-            getProject().deleteMarkers(SigilCore.MARKER_UNRESOLVED_DEPENDENCY, true,
-                IResource.DEPTH_ONE);
-
-            // Find missing imports
-            Collection<IPackageImport> imports = getBundle().getBundleInfo().getImports();
-            for (IPackageImport pkgImport : imports)
-            {
-                if (resolution.getProvider(pkgImport) == null)
-                {
-                    markMissingImport(pkgImport, getProject());
-                }
-            }
-
-            // Find missing required bundles
-            Collection<IRequiredBundle> requiredBundles = getBundle().getBundleInfo().getRequiredBundles();
-            for (IRequiredBundle requiredBundle : requiredBundles)
-            {
-                if (resolution.getProvider(requiredBundle) == null)
-                {
-                    markMissingRequiredBundle(requiredBundle, getProject());
-                }
-            }
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to update problems", e);
-        }
-    }
-
-    private void checkChanges(IProgressMonitor monitor,
-        final List<IRequirementModelElement> reqs,
-        final List<ICapabilityModelElement> caps)
-    {
-        visit(new IModelWalker()
-        {
-            public boolean visit(IModelElement element)
-            {
-                if (element instanceof IRequirementModelElement)
-                {
-                    reqs.add((IRequirementModelElement) element);
-                }
-                else if (element instanceof ICapabilityModelElement)
-                {
-                    // also calculate uses during this pass to save multi pass on model
-                    if (element instanceof IPackageExport)
-                    {
-                        IPackageExport pe = (IPackageExport) element;
-                        try
-                        {
-                            pe.setUses(Arrays.asList(JavaHelper.findUses(
-                                pe.getPackageName(), SigilProject.this)));
-                        }
-                        catch (CoreException e)
-                        {
-                            SigilCore.error("Failed to build uses list for " + pe, e);
-                        }
-                    }
-
-                    caps.add((ICapabilityModelElement) element);
-                }
-                return true;
-            }
-        });
-    }
-
-    private boolean isRequirementsChanged(List<IRequirementModelElement> dependencies)
-    {
-        if (lastReqs.equals(dependencies))
-        {
-            return false;
-        }
-        else
-        {
-            lastReqs = dependencies;
-            return true;
-        }
-    }
-
-    private boolean isCapabilitiesChanged(List<ICapabilityModelElement> capabilites)
-    {
-        if (lastCaps.equals(capabilites))
-        {
-            return false;
-        }
-        else
-        {
-            lastCaps = capabilites;
-            return true;
-        }
-    }
-
-    private static void markMissingImport(IPackageImport pkgImport, IProject project)
-        throws CoreException
-    {
-        IMarker marker = project.getProject().createMarker(
-            SigilCore.MARKER_UNRESOLVED_IMPORT_PACKAGE);
-        marker.setAttribute("element", pkgImport.getPackageName());
-        marker.setAttribute("versionRange", pkgImport.getVersions().toString());
-        marker.setAttribute(IMarker.MESSAGE, "Cannot resolve imported package \""
-            + pkgImport.getPackageName() + "\" with version range "
-            + pkgImport.getVersions());
-        marker.setAttribute(IMarker.SEVERITY,
-            pkgImport.isOptional() ? IMarker.SEVERITY_WARNING : IMarker.SEVERITY_ERROR);
-        marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
-    }
-
-    private static void markMissingRequiredBundle(IRequiredBundle req, IProject project)
-        throws CoreException
-    {
-        IMarker marker = project.getProject().createMarker(
-            SigilCore.MARKER_UNRESOLVED_REQUIRE_BUNDLE);
-        marker.setAttribute("element", req.getSymbolicName());
-        marker.setAttribute("versionRange", req.getVersions().toString());
-        marker.setAttribute(IMarker.MESSAGE, "Cannot resolve required bundle \""
-            + req.getSymbolicName() + "\" with version range " + req.getVersions());
-        marker.setAttribute(IMarker.SEVERITY, req.isOptional() ? IMarker.SEVERITY_WARNING
-            : IMarker.SEVERITY_ERROR);
-        marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
-    }
-
-    public Collection<IClasspathEntry> findExternalClasspath(IProgressMonitor monitor)
-        throws CoreException
-    {
-        return JavaHelper.resolveClasspathEntrys(this, monitor);
-    }
-
-    public Version getVersion()
-    {
-        ISigilBundle bundle = getBundle();
-        return bundle == null ? null : bundle.getBundleInfo() == null ? null
-            : bundle.getBundleInfo().getVersion();
-    }
-
-    public String getSymbolicName()
-    {
-        ISigilBundle bundle = getBundle();
-        return bundle == null ? null : bundle.getBundleInfo() == null ? null
-            : bundle.getBundleInfo().getSymbolicName();
-    }
-
-    public IProject getProject()
-    {
-        return project;
-    }
-
-    public ISigilBundle getBundle()
-    {
-        ISigilBundle b = null;
-
-        try
-        {
-            synchronized (bldProjectFile)
-            {
-                if (bundle == null)
-                {                   
-                    IPath loc = bldProjectFile.getLocation();
-                    if (loc == null) {
-                        // callers can protect against this by using 
-                        // checking exists()
-                        throw new IllegalStateException("Sigil project does not exist");
-                    }
-                    else if (loc.toFile().exists())
-                    {
-                        bundle = parseContents(bldProjectFile);
-                    }
-                    else
-                    {
-                        bundle = setupDefaults();
-                    }
-                }
-
-                b = bundle;
-            }
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to build bundle", e);
-        }
-
-        return b;
-    }
-
-    public void setBundle(ISigilBundle bundle)
-    {
-        synchronized (bldProjectFile)
-        {
-            this.bundle = bundle;
-        }
-    }
-
-    public IJavaProject getJavaModel()
-    {
-        return JavaCore.create(project);
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (obj == null)
-            return false;
-
-        if (obj == this)
-            return true;
-
-        try
-        {
-            SigilProject p = (SigilProject) obj;
-            return getSymbolicName().equals(p.getSymbolicName())
-                && (getVersion() == null ? p.getVersion() == null : getVersion().equals(
-                    p.getVersion()));
-        }
-        catch (ClassCastException e)
-        {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode()
-    {
-        String bsn = getSymbolicName();
-        int hc = bsn == null ? 1 : bsn.hashCode();
-        if (getVersion() != null)
-        {
-            hc *= getVersion().hashCode();
-        }
-        hc *= 7;
-        return hc;
-    }
-
-    @Override
-    public String toString()
-    {
-        return "SigilProject[" + getSymbolicName() + ":" + getVersion() + "]";
-    }
-
-    public void resetClasspath(IProgressMonitor monitor, boolean forceResolve) throws CoreException
-    {
-        if (forceResolve) {
-            processRequirementsChanges(monitor);
-        }
-        
-        Path containerPath = new Path(SigilCore.CLASSPATH_CONTAINER_PATH);
-        IJavaProject java = getJavaModel();
-        ClasspathContainerInitializer init = JavaCore.getClasspathContainerInitializer(SigilCore.CLASSPATH_CONTAINER_PATH);
-        ThreadProgressMonitor.setProgressMonitor(monitor);
-        try
-        {
-            init.requestClasspathContainerUpdate(containerPath, java, null);
-        }
-        finally
-        {
-            ThreadProgressMonitor.setProgressMonitor(null);
-        }
-    }
-
-    public IPath findBundleLocation() throws CoreException
-    {
-        IPath p = PathUtil.newPathIfExists(getBundle().getLocation());
-        if (p == null)
-        {
-            p = SigilCore.getDefault().findDefaultBundleLocation(this);
-        }
-        return p;
-    }
-
-    public IModelElement findImport(final String packageName,
-        final IProgressMonitor monitor)
-    {
-        final IModelElement[] found = new IModelElement[1];
-
-        visit(new IModelWalker()
-        {
-            public boolean visit(IModelElement element)
-            {
-                if (element instanceof IPackageImport)
-                {
-                    IPackageImport pi = (IPackageImport) element;
-                    if (pi.getPackageName().equals(packageName))
-                    {
-                        found[0] = pi;
-                        return false;
-                    }
-                }
-                else if (element instanceof IRequiredBundle)
-                {
-                    IRequiredBundle rb = (IRequiredBundle) element;
-                    try
-                    {
-                        IRepositoryManager manager = SigilProject.this.getRepositoryManager();
-                        ResolutionConfig config = new ResolutionConfig(
-                            ResolutionConfig.IGNORE_ERRORS);
-                        IResolution res = manager.getBundleResolver().resolve(rb, config,
-                            new ResolutionMonitorAdapter(monitor));
-                        ISigilBundle b = res.getProvider(rb);
-                        for (IPackageExport pe : b.getBundleInfo().getExports())
-                        {
-                            if (pe.getPackageName().equals(packageName))
-                            {
-                                found[0] = rb;
-                                return false;
-                            }
-                        }
-                    }
-                    catch (ResolutionException e)
-                    {
-                        SigilCore.error("Failed to resolve " + rb, e);
-                    }
-                }
-                return true;
-            }
-
-        });
-
-        return found[0];
-    }
-
-    public boolean isInClasspath(String packageName, IProgressMonitor monitor)
-        throws CoreException
-    {
-        if (findImport(packageName, monitor) != null)
-        {
-            return true;
-        }
-
-        for (String path : getBundle().getClasspathEntrys())
-        {
-            IClasspathEntry cp = getJavaModel().decodeClasspathEntry(path);
-            for (IPackageFragmentRoot root : getJavaModel().findPackageFragmentRoots(cp))
-            {
-                if (findPackage(packageName, root))
-                {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    public boolean isInClasspath(ISigilBundle bundle)
-    {
-        for (String path : getBundle().getClasspathEntrys())
-        {
-            IClasspathEntry cp = getJavaModel().decodeClasspathEntry(path);
-            switch (cp.getEntryKind())
-            {
-                case IClasspathEntry.CPE_PROJECT:
-                    ISigilProjectModel p = bundle.getAncestor(ISigilProjectModel.class);
-                    return p != null && cp.getPath().equals(p.getProject().getFullPath());
-                case IClasspathEntry.CPE_LIBRARY:
-                    return cp.getPath().equals(bundle.getLocation());
-            }
-        }
-
-        return false;
-    }
-
-    private boolean findPackage(String packageName, IParent parent)
-        throws JavaModelException
-    {
-        for (IJavaElement e : parent.getChildren())
-        {
-            if (e.getElementType() == IJavaElement.PACKAGE_FRAGMENT)
-            {
-                return e.getElementName().equals(packageName);
-            }
-
-            if (e instanceof IParent)
-            {
-                if (findPackage(packageName, (IParent) e))
-                {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    private ISigilBundle setupDefaults()
-    {
-        ISigilBundle bundle = ModelElementFactory.getInstance().newModelElement(
-            ISigilBundle.class);
-        IBundleModelElement info = ModelElementFactory.getInstance().newModelElement(
-            IBundleModelElement.class);
-        bundle.setBundleInfo(info);
-        bundle.setParent(this);
-        return bundle;
-    }
-
-    private ISigilBundle parseContents(IFile projectFile) throws CoreException
-    {
-        if (projectFile.getName().equals(SigilCore.SIGIL_PROJECT_FILE))
-        {
-            return parseBldContents(projectFile.getLocationURI());
-        }
-        else
-        {
-            throw SigilCore.newCoreException("Unexpected project file: "
-                + projectFile.getName(), null);
-        }
-    }
-
-    private ISigilBundle parseBldContents(URI uri) throws CoreException
-    {
-        try
-        {
-            bldProject = BldFactory.getProject(uri, true);
-            ISigilBundle bundle = bldProject.getDefaultBundle();
-
-            if (bundle == null)
-            {
-                throw SigilCore.newCoreException("No default bundle", null);
-            }
-
-            bundle.setParent(this);
-            return bundle;
-        }
-        catch (IOException e)
-        {
-            throw SigilCore.newCoreException("Failed to parse " + uri, e);
-        }
-    }
-
-    private InputStream buildContents() throws CoreException
-    {
-        ByteArrayOutputStream buf = new ByteArrayOutputStream();
-        try
-        {
-            if (bldProject == null)
-            {
-                bldProject = BldFactory.newProject(bldProjectFile.getLocationURI(), null);
-            }
-            bldProject.setDefaultBundle(getBundle());
-            bldProject.saveTo(buf);
-        }
-        catch (IOException e)
-        {
-            throw SigilCore.newCoreException("Failed to save project file", e);
-        }
-        return new ByteArrayInputStream(buf.toByteArray());
-    }
-
-    public String getName()
-    {
-        return getProject().getName();
-    }
-
-    public IPath findOutputLocation() throws CoreException
-    {
-        return getProject().getLocation().append(
-            getJavaModel().getOutputLocation().removeFirstSegments(1));
-    }
-
-    public IBldProject getBldProject() throws CoreException
-    {
-        try
-        {
-            return BldFactory.getProject(project.getFile(IBldProject.PROJECT_FILE).getLocationURI());
-        }
-        catch (IOException e)
-        {
-            throw SigilCore.newCoreException("Failed to get project file: ", e);
-        }
-    }
-
-    public IRepositoryConfig getRepositoryConfig() throws CoreException
-    {
-        try
-        {
-            return BldFactory.getConfig(project.getFile(IBldProject.PROJECT_FILE).getLocationURI());
-        }
-        catch (IOException e)
-        {
-            throw SigilCore.newCoreException("Failed to get project file: ", e);
-        }
-    }
-    
-    public boolean isInBundleClasspath(IPackageFragment root) throws JavaModelException
-    {
-        if (getBundle().getClasspathEntrys().isEmpty())
-        {
-            for (String p : getBundle().getPackages())
-            {
-                SigilCore.log("Checking " + p + "->" + root.getElementName());
-                Matcher m = GlobCompiler.compile(p).matcher(root.getElementName());
-                if (m.matches())
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-        else
-        {
-            IPackageFragmentRoot parent = (IPackageFragmentRoot) root.getParent();
-            String enc = getJavaModel().encodeClasspathEntry(
-                parent.getRawClasspathEntry());
-            return getBundle().getClasspathEntrys().contains(enc.trim());
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel#getRepositoryManager()
-     */
-    public IRepositoryManager getRepositoryManager()
-    {
-        return SigilCore.getRepositoryManager(this);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel#exists()
-     */
-    public boolean exists()
-    {
-        return project.exists() && project.getFile(IBldProject.PROJECT_FILE).exists();
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/ExtensionUtils.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/ExtensionUtils.java
deleted file mode 100644
index 5d1cd0b..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/ExtensionUtils.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.model.repository;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.swt.graphics.Image;
-import org.osgi.framework.Bundle;
-
-/**
- * @author dave
- *
- */
-public class ExtensionUtils
-{
-    public static List<IRepositoryType> loadRepositoryTypes()
-    {
-        List<IRepositoryType> repositories = new ArrayList<IRepositoryType>();
-
-        IExtensionRegistry registry = Platform.getExtensionRegistry();
-
-        IExtensionPoint p = registry.getExtensionPoint(SigilCore.REPOSITORY_PROVIDER_EXTENSION_POINT_ID);
-
-        for (IExtension e : p.getExtensions())
-        {
-            for (IConfigurationElement c : e.getConfigurationElements())
-            {
-                repositories.add(toRepositoryType(e, c));
-            }
-        }
-
-        return repositories;
-    }
-    
-    /**
-     * @param ext 
-     * @param conf
-     * @return
-     */
-    public static IRepositoryType toRepositoryType(IExtension ext, IConfigurationElement conf)
-    {
-        String id = conf.getAttribute("id");
-        String type = conf.getAttribute("type");
-        boolean dynamic = Boolean.valueOf(conf.getAttribute("dynamic"));
-        String icon = conf.getAttribute("icon");
-        String provider = conf.getAttribute("alias");                
-        Image image = (icon == null || icon.trim().length() == 0) ? null
-            : loadImage(ext, icon);
-        return new RepositoryType(id, provider, type, dynamic, image);
-    }
-    
-    @SuppressWarnings("unchecked")
-    private static Image loadImage(IExtension ext, String icon)
-    {
-        int i = icon.lastIndexOf("/");
-        String path = i == -1 ? "/" : icon.substring(0, i);
-        String name = i == -1 ? icon : icon.substring(i + 1);
-
-        Bundle b = Platform.getBundle(ext.getContributor().getName());
-
-        Enumeration<URL> en = b.findEntries(path, name, false);
-        Image image = null;
-
-        if (en.hasMoreElements())
-        {
-            try
-            {
-                image = SigilCore.loadImage(en.nextElement());
-            }
-            catch (IOException e)
-            {
-                SigilCore.error("Failed to load image", e);
-            }
-        }
-        else
-        {
-            SigilCore.error("No such image " + icon + " in bundle " + b.getSymbolicName());
-        }
-
-        return image;
-    }
-    
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryModel.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryModel.java
deleted file mode 100644
index 45888c1..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryModel.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.model.repository;
-
-import java.util.Properties;
-
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
-
-public class RepositoryModel implements IRepositoryModel
-{
-    public static final String NAME = "name";
-
-    private String id;
-
-    private IRepositoryType type;
-
-    private Properties properties = new Properties();
-    
-    private Throwable throwable;
-
-    public RepositoryModel(String id, IRepositoryType type)
-    {
-        this.id = id;
-        this.type = type;
-    }
-
-    /**
-     * @param exception 
-     * @param id2
-     * @param type2
-     * @param properties2
-     */
-    public RepositoryModel(String id, IRepositoryType type, Properties properties, Exception exception)
-    {
-        this.id = id;
-        this.type = type;
-        this.properties = properties;
-        this.throwable = exception;
-    }
-
-    public Properties getProperties()
-    {
-        return properties;
-    }
-
-    public IRepositoryType getType()
-    {
-        return type;
-    }
-
-    public String getId()
-    {
-        return id;
-    }
-
-    public String getName()
-    {
-        if ( getType().isDynamic() ) {
-            String name = properties.getProperty(NAME);
-            if ( name == null ) {
-                name = id;
-            }
-            return name;
-        }
-        else {
-            return getType().getName();
-        }
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        try
-        {
-            RepositoryModel e = (RepositoryModel) obj;
-            return id.equals(e.id);
-        }
-        catch (ClassCastException e)
-        {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return id.hashCode();
-    }
-
-    public String toString()
-    {
-        return type.getId() + ":" + id + ":" + getName();
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel#getProblem()
-     */
-    public Throwable getProblem()
-    {
-        return throwable;
-    }
-
-}
\ No newline at end of file
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryPreferences.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryPreferences.java
deleted file mode 100644
index 46e0899..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryPreferences.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.model.repository;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.UUID;
-
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryPreferences;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
-import org.apache.felix.sigil.eclipse.preferences.PrefsUtils;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-public class RepositoryPreferences implements IRepositoryPreferences
-{
-
-    private static final String REPOSITORY = "repository.";
-    private static final String REPOSITORY_ORDER = REPOSITORY + "order";
-    private static final String INSTANCES = ".instances";
-    private static final String NAME = ".name";
-    private static final String LOC = ".loc";
-    private static final String TIMESTAMP = ".timestamp";
-
-    public List<IRepositoryModel> loadRepositories()
-    {
-        IPreferenceStore prefs = SigilCore.getDefault().getPreferenceStore();
-
-        ArrayList<IRepositoryModel> repositories = new ArrayList<IRepositoryModel>();
-
-        for (IRepositoryType type : loadRepositoryTypes())
-        {
-            String typeID = type.getId();
-
-            if (type.isDynamic())
-            {
-                String instances = prefs.getString(REPOSITORY + typeID + INSTANCES);
-                if (instances.trim().length() > 0)
-                {
-                    for (String instance : instances.split(","))
-                    {
-                        String key = REPOSITORY + typeID + "." + instance;
-                        repositories.add(loadRepository(instance, key, type, prefs));
-                    }
-                }
-            }
-            else
-            {
-                String key = REPOSITORY + typeID;
-                repositories.add(loadRepository(typeID, key, type, prefs));
-            }
-
-        }
-        
-        final List<String> order = PrefsUtils.stringToList(prefs.getString(REPOSITORY_ORDER));
-        
-        Collections.sort(repositories, new Comparator<IRepositoryModel>() {
-            public int compare(IRepositoryModel o1, IRepositoryModel o2)
-            {
-                int i1 = order.indexOf(o1.getId());
-                int i2 = order.indexOf(o2.getId());
-                
-                if ( i1 < i2 ) {
-                    return -1;
-                }
-                else if ( i1 > i2 ) {
-                    return 1;
-                }
-                else {
-                    return 0;
-                }
-            }
-            
-        });
-
-        return repositories;
-    }
-
-    public IRepositoryModel findRepository(String id)
-    {
-        for (IRepositoryModel model : loadRepositories())
-        {
-            if (model.getId().equals(id))
-            {
-                return model;
-            }
-        }
-        return null;
-    }
-
-    public void saveRepositories(List<IRepositoryModel> repositories)
-        throws CoreException
-    {
-        IPreferenceStore prefs = getPreferences();
-
-        HashMap<IRepositoryType, List<IRepositoryModel>> mapped = new HashMap<IRepositoryType, List<IRepositoryModel>>(
-            repositories.size());
-
-        saveRepositoryPreferences(repositories, mapped);
-        createNewEntries(mapped, prefs);
-        deleteOldEntries(repositories, prefs);
-        // do this last as it is a signal to preferences
-        // listeners to read repo config
-        setRepositoryOrder(repositories, prefs);
-    }
-
-    /**
-     * @param repositories
-     * @param prefs
-     */
-    private void setRepositoryOrder(List<IRepositoryModel> repositories,
-        IPreferenceStore prefs)
-    {        
-        ArrayList<String> ids = new ArrayList<String>();
-        for(IRepositoryModel model : repositories) {
-            ids.add(model.getId());
-        }
-        prefs.setValue(REPOSITORY_ORDER, PrefsUtils.listToString(ids));
-    }
-    
-
-    public IRepositoryModel newRepositoryElement(IRepositoryType type)
-    {
-        String id = UUID.randomUUID().toString();
-        RepositoryModel element = new RepositoryModel(id, type);
-        element.getProperties().setProperty("id", id);
-        return element;
-    }
-
-    private IPreferenceStore getPreferences()
-    {
-        return SigilCore.getDefault().getPreferenceStore();
-    }
-
-    private void deleteOldEntries(List<IRepositoryModel> repositories,
-        IPreferenceStore prefs)
-    {
-        for (IRepositoryModel e : loadRepositories())
-        {
-            if (!repositories.contains(e))
-            {
-                new File(makeFileName(e)).delete();
-                String key = makeKey(e);
-                prefs.setToDefault(key + LOC);
-                prefs.setToDefault(key + NAME);
-            }
-        }
-
-        for (IRepositoryType type : loadRepositoryTypes())
-        {
-            boolean found = false;
-            for (IRepositoryModel e : repositories)
-            {
-                if (e.getType().equals(type))
-                {
-                    found = true;
-                    break;
-                }
-            }
-
-            if (!found)
-            {
-                prefs.setToDefault(REPOSITORY + type.getId() + INSTANCES);
-            }
-        }
-    }
-
-    private static void createNewEntries(
-        HashMap<IRepositoryType, List<IRepositoryModel>> mapped, IPreferenceStore prefs)
-    {
-        for (Map.Entry<IRepositoryType, List<IRepositoryModel>> entry : mapped.entrySet())
-        {
-            IRepositoryType type = entry.getKey();
-            if (type.isDynamic())
-            {
-                StringBuffer buf = new StringBuffer();
-
-                for (IRepositoryModel element : entry.getValue())
-                {
-                    if (buf.length() > 0)
-                    {
-                        buf.append(",");
-                    }
-                    buf.append(element.getId());
-                    saveRepository(element, prefs);
-                }
-
-                prefs.setValue(REPOSITORY + type.getId() + INSTANCES, buf.toString());
-            }
-            else
-            {
-                IRepositoryModel element = entry.getValue().get(0);
-                saveRepository(element, prefs);
-            }
-        }
-    }
-
-    private void saveRepositoryPreferences(List<IRepositoryModel> repositories,
-        HashMap<IRepositoryType, List<IRepositoryModel>> mapped) throws CoreException
-    {
-        for (IRepositoryModel rep : repositories)
-        {
-            try
-            {
-                createDir(makeFileName(rep));
-                toPreferenceStore(rep).save();
-                List<IRepositoryModel> list = mapped.get(rep.getType());
-                if (list == null)
-                {
-                    list = new ArrayList<IRepositoryModel>(1);
-                    mapped.put(rep.getType(), list);
-                }
-                list.add(rep);
-            }
-            catch (IOException e)
-            {
-                throw SigilCore.newCoreException("Failed to save repository preferences",
-                    e);
-            }
-        }
-    }
-
-    private static void createDir(String fileName)
-    {
-        File file = new File(fileName);
-        file.getParentFile().mkdirs();
-    }
-
-    private static void saveRepository(IRepositoryModel element, IPreferenceStore prefs)
-    {
-        String key = makeKey(element);
-        prefs.setValue(key + LOC, makeFileName(element));
-        prefs.setValue(key + TIMESTAMP, now());
-    }
-
-    private static long now()
-    {
-        return System.currentTimeMillis();
-    }
-
-    private static String makeKey(IRepositoryModel element)
-    {
-        IRepositoryType type = element.getType();
-
-        String key = REPOSITORY + type.getId();
-        if (type.isDynamic())
-            key = key + "." + element.getId();
-
-        return key;
-    }
-
-    private static String makeFileName(IRepositoryModel element)
-    {
-        IPath path = SigilCore.getDefault().getStateLocation();
-        path = path.append("repository");
-        path = path.append(element.getType().getId());
-        path = path.append(element.getId());
-        return path.toOSString();
-    }
-
-    private RepositoryModel loadRepository(String id, String key,
-        IRepositoryType type, IPreferenceStore prefs)
-    {
-        RepositoryModel element = new RepositoryModel(id, type);
-
-        Properties props = element.getProperties();
-        if ( type.isDynamic()) {
-            String loc = prefs.getString(key + LOC);
-
-            if (loc == null || loc.trim().length() == 0)
-            {
-                loc = makeFileName(element);
-            }
-
-            if (new File(loc).exists())
-            {
-                FileInputStream in = null; 
-                try
-                {
-                    in = new FileInputStream(loc);
-                    props.load(in);
-                    
-                    if (type.isDynamic() && !props.containsKey(RepositoryModel.NAME)) {
-                        String name = prefs.getString(key + NAME);
-                        props.setProperty(RepositoryModel.NAME, name);
-                    }
-                    
-                }
-                catch (IOException e)
-                {
-                    SigilCore.error("Failed to load properties for repository " + key, e);
-                }
-                finally {
-                    if ( in != null ) {
-                        try
-                        {
-                            in.close();
-                        }
-                        catch (IOException e)
-                        {
-                            SigilCore.error("Failed to close properties file " + loc, e);
-                        }
-                    }
-                }
-            }
-        }
-
-        if (!props.containsKey(IRepositoryConfig.REPOSITORY_PROVIDER)) {
-            props.setProperty(IRepositoryConfig.REPOSITORY_PROVIDER, type.getProvider());
-        }
-
-        props.setProperty("id", id);
-
-        return element;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.eclipse.model.repository.IRepositoryPreferences#loadRepositoryTypes()
-     */
-    public List<IRepositoryType> loadRepositoryTypes()
-    {
-        return ExtensionUtils.loadRepositoryTypes();
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.eclipse.model.repository.IRepositoryPreferences#getPreferenceStore(org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel)
-     */
-    public PreferenceStore toPreferenceStore(final IRepositoryModel model)
-    {
-        PreferenceStore store = new PreferenceStore();
-        store.setFilename(makeFileName(model));
-        
-        for (Map.Entry<Object, Object> e : model.getProperties().entrySet()) {
-            store.setValue((String) e.getKey(), (String) e.getValue());
-        }
-        
-        store.setValue("provider", model.getType().getProvider());
-
-        store.addPropertyChangeListener(new IPropertyChangeListener()
-        {            
-            public void propertyChange(PropertyChangeEvent event)
-            {
-                model.getProperties().setProperty(event.getProperty(), event.getNewValue().toString());
-            }
-        });
-        
-        return store;
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java
deleted file mode 100644
index 1630699..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.model.repository;
-
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
-import org.eclipse.swt.graphics.Image;
-
-public class RepositoryType implements IRepositoryType
-{
-    private final String type;
-    private final String id;
-    private final String provider;
-    private final Image icon;
-    private final boolean dynamic;
-
-    public RepositoryType(String id, String provider, String type, boolean dynamic, Image icon)
-    {
-        this.id = id;
-        this.type = type;
-        this.dynamic = dynamic;
-        this.provider = provider;
-        this.icon = icon;
-    }
-
-    public String getName()
-    {
-        return type;
-    }
-    
-    public String getProvider() {
-        return provider;
-    }
-
-    public String getId()
-    {
-        return id;
-    }
-
-    public Image getIcon()
-    {
-        return icon;
-    }
-
-    public boolean isDynamic()
-    {
-        return dynamic;
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        try
-        {
-            RepositoryType t = (RepositoryType) obj;
-            return t.id.equals(id);
-        }
-        catch (ClassCastException e)
-        {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return id.hashCode();
-    }
-
-    @Override
-    public String toString()
-    {
-        return type;
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/preferences/SigilPreferencesInitializer.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/preferences/SigilPreferencesInitializer.java
deleted file mode 100644
index f0fdaca..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/preferences/SigilPreferencesInitializer.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.preferences;
-
-import org.apache.felix.sigil.common.osgi.VersionRangeBoundingRule;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.preferences.PrefsUtils;
-import org.apache.felix.sigil.eclipse.preferences.PromptablePreference;
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-public class SigilPreferencesInitializer extends AbstractPreferenceInitializer
-{
-
-    public static final String[] EXCLUDED_RESOURCES = new String[] { ".project",
-            ".classpath", ".settings" };
-
-    @Override
-    public void initializeDefaultPreferences()
-    {
-        IPreferenceStore store = SigilCore.getDefault().getPreferenceStore();
-        setUpDefaults(store);
-        migrateOldPreferences(store);
-    }
-
-    /**
-     * @param store
-     */
-    private void setUpDefaults(IPreferenceStore store)
-    {
-        store.setDefault(SigilCore.OSGI_INSTALL_CHECK_PREFERENCE, true);
-
-        store.setDefault(SigilCore.DEFAULT_VERSION_LOWER_BOUND,
-            VersionRangeBoundingRule.Micro.name());
-        store.setDefault(SigilCore.DEFAULT_VERSION_UPPER_BOUND,
-            VersionRangeBoundingRule.Any.name());
-
-        store.setDefault(SigilCore.DEFAULT_EXCLUDED_RESOURCES,
-            PrefsUtils.arrayToString(EXCLUDED_RESOURCES));
-
-        store.setDefault(SigilCore.PREFERENCES_NOASK_OSGI_INSTALL, false);
-
-        store.setDefault(SigilCore.PREFERENCES_ADD_IMPORT_FOR_EXPORT,
-            PromptablePreference.Prompt.name());
-
-        store.setDefault(SigilCore.PREFERENCES_REBUILD_PROJECTS,
-            PromptablePreference.Prompt.name());
-
-        store.setDefault("repository.order",
-            "org.apache.felix.sigil.core.workspaceprovider");
-    }
-    
-    /**
-     * @param store
-     */
-    private void migrateOldPreferences(IPreferenceStore store)
-    {
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/property/SigilPropertyTester.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/property/SigilPropertyTester.java
deleted file mode 100644
index dff4319..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/property/SigilPropertyTester.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.property;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-
-public class SigilPropertyTester extends PropertyTester
-{
-
-    public SigilPropertyTester()
-    {
-    }
-
-    public boolean test(Object receiver, String property, Object[] args,
-        Object expectedValue)
-    {
-        IResource resource = (IResource) receiver;
-        if ("isSigilProject".equals(property))
-        {
-            return expectedValue.equals(isSigilProjectLikeResource(resource));
-        }
-        return false;
-    }
-
-    /**
-     * @param resource
-     * @return
-     */
-    private static boolean isSigilProjectLikeResource(IResource resource)
-    {
-        if (resource instanceof IProject)
-        {
-            IProject p = (IProject) resource;
-            return SigilCore.isSigilProject(p);
-        }
-        else
-        {
-            return resource.getName().equals(SigilCore.SIGIL_PROJECT_FILE);
-        }
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/OSGiInstallRepository.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/OSGiInstallRepository.java
deleted file mode 100644
index c479fa2..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/OSGiInstallRepository.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.eclipse;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.jar.JarFile;
-
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.ModelElementFactoryException;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.repository.AbstractBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-import org.apache.felix.sigil.common.util.ManifestUtil;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.install.IOSGiInstall;
-import org.eclipse.core.runtime.IPath;
-
-public class OSGiInstallRepository extends AbstractBundleRepository
-{
-
-    private Map<String, List<ISigilBundle>> bundles;
-
-    public OSGiInstallRepository(String id)
-    {
-        super(id);
-    }
-
-    public void refresh()
-    {
-        synchronized (this)
-        {
-            bundles = null;
-        }
-
-        notifyChange();
-    }
-
-    @Override
-    public void accept(IRepositoryVisitor visitor, int options)
-    {
-        IOSGiInstall install = SigilCore.getInstallManager().getDefaultInstall();
-
-        if (install != null)
-        {
-            List<ISigilBundle> found = null;
-
-            synchronized (this)
-            {
-                found = bundles == null ? null : bundles.get(install.getId());
-            }
-
-            if (found == null)
-            {
-                found = new ArrayList<ISigilBundle>();
-                IPath source = install.getType().getSourceLocation();
-
-                for (IPath p : install.getType().getDefaultBundleLocations())
-                {
-                    loadBundle(p, found, source);
-                }
-
-                synchronized (this)
-                {
-                    bundles = new HashMap<String, List<ISigilBundle>>();
-                    bundles.put(install.getId(), found);
-                }
-            }
-
-            for (ISigilBundle b : found)
-            {
-                if (!visitor.visit(b))
-                {
-                    break;
-                }
-            }
-        }
-    }
-
-    private void loadBundle(IPath p, List<ISigilBundle> bundles, IPath source)
-    {
-        File f = p.toFile();
-        JarFile jar = null;
-        try
-        {
-            jar = new JarFile(f, false);
-            ISigilBundle bundle = buildBundle(jar, f);
-            if (bundle != null)
-            {
-                bundle.setLocation(f);
-                bundle.setSourcePathLocation(source.toFile());
-                // XXX hard coded src location
-                bundle.setSourceRootPath("src");
-                bundles.add(bundle);
-            }
-        }
-        catch (IOException e)
-        {
-            BldCore.error("Failed to read jar file " + f, e);
-        }
-        catch (ModelElementFactoryException e)
-        {
-            BldCore.error("Failed to build bundle " + f, e);
-        }
-        catch (RuntimeException e)
-        {
-            BldCore.error("Failed to build bundle " + f, e);
-        }
-        finally
-        {
-            if (jar != null)
-            {
-                try
-                {
-                    jar.close();
-                }
-                catch (IOException e)
-                {
-                    BldCore.error("Failed to close jar file", e);
-                }
-            }
-        }
-    }
-
-    private ISigilBundle buildBundle(JarFile jar, File f) throws IOException
-    {
-        IBundleModelElement info = ManifestUtil.buildBundleModelElement(jar);
-
-        ISigilBundle bundle = null;
-
-        if (info != null)
-        {
-            bundle = ModelElementFactory.getInstance().newModelElement(ISigilBundle.class);
-            bundle.addChild(info);
-            bundle.setLocation(f);
-        }
-
-        return bundle;
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/OSGiInstallRepositoryProvider.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/OSGiInstallRepositoryProvider.java
deleted file mode 100644
index 77591e1..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/OSGiInstallRepositoryProvider.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.eclipse;
-
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-
-public class OSGiInstallRepositoryProvider implements IRepositoryProvider
-{
-    public IBundleRepository createRepository(String id, Properties preferences)
-    {
-        return new OSGiInstallRepository(id);
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/WorkspaceRepository.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/WorkspaceRepository.java
deleted file mode 100644
index 85a6eac..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/WorkspaceRepository.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.eclipse;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.repository.AbstractBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-import org.apache.felix.sigil.common.repository.ResolutionConfig;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IResourceVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.JavaCore;
-
-public class WorkspaceRepository extends AbstractBundleRepository implements IResourceChangeListener
-{
-
-    private static final int UPDATE_MASK = IResourceDelta.CONTENT | IResourceDelta.OPEN;
-
-    static final int EVENT_MASKS = IResourceChangeEvent.PRE_DELETE
-        | IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_REFRESH;
-
-    public WorkspaceRepository(String id)
-    {
-        super(id);
-    }
-
-    @Override
-    public void accept(IRepositoryVisitor visitor, int options)
-    {
-        List<ISigilProjectModel> models = SigilCore.getRoot().getProjects();
-        for (ISigilProjectModel project : models)
-        {
-            ISigilBundle b = project.getBundle();
-            if (b == null)
-            {
-                SigilCore.error("No bundle found for project "
-                    + project.getProject().getName());
-            }
-            else
-            {
-                if ((options & ResolutionConfig.COMPILE_TIME) != 0)
-                {
-                    b = compileTimeFilter(project, b);
-                }
-                visitor.visit(b);
-            }
-        }
-    }
-
-    private ISigilBundle compileTimeFilter(ISigilProjectModel project, ISigilBundle bundle)
-    {
-        bundle = (ISigilBundle) bundle.clone();
-
-        Collection<String> packages = findPackages(project);
-
-        for (IPackageExport pe : bundle.getBundleInfo().getExports())
-        {
-            final String packagePath = pe.getPackageName();
-            if (!packages.contains(packagePath))
-            {
-                bundle.getBundleInfo().removeExport(pe);
-            }
-        }
-
-        return bundle;
-    }
-
-    private Collection<String> findPackages(ISigilProjectModel project)
-    {
-        final IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
-        final IContentType javaContentType = contentTypeManager.getContentType("org.eclipse.jdt.core.javaSource");
-        final HashSet<String> packages = new HashSet<String>();
-
-        try
-        {
-            project.getProject().accept(new IResourceVisitor()
-            {
-                public boolean visit(IResource resource) throws CoreException
-                {
-                    if (resource instanceof IFile)
-                    {
-                        IFile f = (IFile) resource;
-                        IContentType ct = contentTypeManager.findContentTypeFor(f.getName());
-                        if (ct != null && ct.isKindOf(javaContentType))
-                        {
-                            ICompilationUnit cu = (ICompilationUnit) JavaCore.create(f);
-                            IPackageFragment pf = (IPackageFragment) cu.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
-                            packages.add(pf.getElementName());
-                        }
-                    }
-
-                    return true;
-                }
-            });
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to read packages for "
-                + project.getProject().getName());
-        }
-
-        return packages;
-    }
-
-    public void refresh()
-    {
-        // no action
-        // TODO this method is used to prompt repository to update caches - 
-        // however caches are complex to maintain in this workspace as the bundle is actively being developed...
-        // potential performance improvement in future?
-    }
-
-    public void resourceChanged(IResourceChangeEvent event)
-    {
-        try
-        {
-            switch (event.getType())
-            {
-                case IResourceChangeEvent.PRE_DELETE:
-                    handleDelete(event);
-                    break;
-                case IResourceChangeEvent.PRE_REFRESH:
-                    handleRefresh(event);
-                    break;
-                case IResourceChangeEvent.POST_CHANGE:
-                    handleChange(event);
-                    break;
-            }
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Workspace repository update failed", e);
-        }
-    }
-
-    private HashSet<IProject> deleted = new HashSet<IProject>();
-
-    private void handleDelete(IResourceChangeEvent event)
-    {
-        if (event.getResource() instanceof IProject)
-        {
-            IProject project = (IProject) event.getResource();
-            if (isSigilProject(project))
-            {
-                deleted.add(project);
-            }
-        }
-    }
-
-    private void handleRefresh(IResourceChangeEvent event)
-    {
-        if (event.getResource() instanceof IProject)
-        {
-            IProject project = (IProject) event.getResource();
-            if (isSigilProject(project))
-            {
-                SigilCore.log("Refreshing workspace repository");
-                notifyChange();
-            }
-        }
-    }
-
-    private void handleChange(IResourceChangeEvent event) throws CoreException
-    {
-        final boolean[] notify = new boolean[1];
-
-        event.getDelta().accept(new IResourceDeltaVisitor()
-        {
-            public boolean visit(IResourceDelta delta) throws CoreException
-            {
-                boolean checkMembers = true;
-
-                IResource resource = delta.getResource();
-                if (resource instanceof IProject)
-                {
-                    IProject project = (IProject) resource;
-                    if (isSigilProject(project))
-                    {
-                        switch (delta.getKind())
-                        {
-                            case IResourceDelta.CHANGED:
-                                int flag = delta.getFlags();
-                                if ((flag & UPDATE_MASK) == 0)
-                                {
-                                    break;
-                                }
-                                // else 
-                                // fall through on purpose
-                            case IResourceDelta.ADDED: // fall through on purpose
-                            case IResourceDelta.REMOVED: // fall through on purpose
-                                notify[0] = true;
-                                break;
-                        }
-                        checkMembers = true;
-                    }
-                    else
-                    {
-                        checkMembers = false;
-                    }
-                }
-                else if (resource.getName().equals(SigilCore.SIGIL_PROJECT_FILE))
-                {
-                    switch (delta.getKind())
-                    {
-                        case IResourceDelta.CHANGED:
-                        case IResourceDelta.ADDED:
-                        case IResourceDelta.REMOVED:
-                            notify[0] = true;
-                    }
-                    checkMembers = false;
-                }
-                return checkMembers && !notify[0];
-            }
-        });
-
-        if (notify[0])
-        {
-            notifyChange();
-        }
-    }
-
-    private boolean isSigilProject(IProject project)
-    {
-        return SigilCore.isSigilProject(project) || deleted.remove(project);
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/WorkspaceRepositoryProvider.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/WorkspaceRepositoryProvider.java
deleted file mode 100644
index 0562ebf..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/WorkspaceRepositoryProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.eclipse;
-
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-public class WorkspaceRepositoryProvider implements IRepositoryProvider
-{
-    private static WorkspaceRepository repository;
-
-    public static WorkspaceRepository getWorkspaceRepository()
-    {
-        return repository;
-    }
-
-    public IBundleRepository createRepository(String id, Properties preferences)
-    {
-        if (repository == null)
-        {
-            repository = new WorkspaceRepository(id);
-            ResourcesPlugin.getWorkspace().addResourceChangeListener(repository,
-                WorkspaceRepository.EVENT_MASKS);
-        }
-        return repository;
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/AbstractEclipseRepositoryConfig.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/AbstractEclipseRepositoryConfig.java
deleted file mode 100644
index 72fdd56..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/AbstractEclipseRepositoryConfig.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-
-/**
- * @author dave
- *
- */
-public abstract class AbstractEclipseRepositoryConfig implements IRepositoryConfig
-{
-
-    protected abstract IRepositoryConfig[] getConfigs();
-    
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getAllRepositories()
-     */
-    public List<String> getAllRepositories()
-    {
-        ArrayList<String> list = new ArrayList<String>();
-        for (IRepositoryConfig c : getConfigs()) {
-            list.addAll(c.getAllRepositories());
-        }
-        list.addAll(readRepositoryNames());
-        return list;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryConfig(java.lang.String)
-     */
-    public Properties getRepositoryConfig(String name)
-    {
-        Properties props = null;
-        for(IRepositoryConfig c : getConfigs()) {
-            props = c.getRepositoryConfig(name);
-            if ( props != null ) {
-                if ( !props.containsKey(RepositoryModel.NAME)) {
-                    props.setProperty(RepositoryModel.NAME, name);
-                }
-                break;
-            }
-        }
-        if ( props == null ) {
-            props = readRepositoryConfig(name);
-        }
-        return props;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryDefinition(java.lang.String)
-     */
-    public URI getRepositoryDefinition(String name)
-    {
-        URI def = null;
-        for(IRepositoryConfig c : getConfigs()) {
-            def = c.getRepositoryDefinition(name);
-            if ( def != null ) {
-                break;
-            }
-        }
-        if ( def == null ) {
-            if ( readRepositoryNames().contains(name) ) {
-                def = URI.create("sigil:eclipse:preferences");
-            }
-        }
-        return def;
-    }
-
-    /**
-     * @return
-     */
-    static List<String> readRepositoryNames()
-    {
-        List<IRepositoryModel> models = findRepositories();
-        ArrayList<String> repos = new ArrayList<String>(models.size());
-        for (IRepositoryModel repo : models)
-        {
-            String id = repo.getId();
-            repos.add(id);
-        }
-        
-        return repos;
-    }
-
-    static Properties readRepositoryConfig(String name) {
-        for (IRepositoryModel repo : findRepositories())
-        {
-            String id = repo.getId();
-            if ( name.equals(id) ) {
-                return repo.getProperties();
-            }
-        }
-        
-        // ok not found
-        return null;
-    }
-    
-    private static final List<IRepositoryModel> findRepositories()
-    {
-        return SigilCore.getRepositoryPreferences().loadRepositories();
-    }    
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/AbstractEclipseRepositoryManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/AbstractEclipseRepositoryManager.java
deleted file mode 100644
index 42bb193..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/AbstractEclipseRepositoryManager.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.common.repository.AbstractRepositoryManager;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.internal.repository.manager.EclipseRepositoryFactory.EclipseRepositoryProviderWrapper;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * @author dave
- *
- */
-public abstract class AbstractEclipseRepositoryManager extends AbstractRepositoryManager implements IPropertyChangeListener
-{
-    private final IRepositoryConfig config;
-    private final IRepositoryCache repositoryCache;
-    
-    public AbstractEclipseRepositoryManager(IRepositoryConfig config, IRepositoryCache repositoryMap)
-    {
-        super(config);
-        this.config = config;
-        this.repositoryCache = repositoryMap;
-    }
-    
-    public IRepositoryConfig getConfig() {
-        return config;
-    }
-    
-    @Override
-    public void initialise()
-    {
-        super.initialise();
-        SigilCore.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-    }
-
-    public void destroy()
-    {
-        IPreferenceStore prefs = SigilCore.getDefault().getPreferenceStore();
-        if (prefs != null)
-        {
-            prefs.removePropertyChangeListener(this);
-        }
-    }    
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.repository.AbstractRepositoryManager#loadRepositories()
-     */
-    @Override
-    protected void loadRepositories()
-    {
-        List<IBundleRepository> list = new ArrayList<IBundleRepository>();
-        scanRepositories(config.getRepositoryPath(), list);
-        setRepositories(list.toArray(new IBundleRepository[list.size()]));
-    }
-    
-    /**
-     * @param list 
-     * @param config2
-     * @param i
-     */
-    private void scanRepositories(List<String> path, List<IBundleRepository> list)
-    {
-        for (String name : path)
-        {
-            if ( IRepositoryConfig.WILD_CARD.equals(name) ) {
-                HashSet<String> defined = new HashSet<String>();
-                for (String n : path) {
-                    if (!IRepositoryConfig.WILD_CARD.equals(n)) {
-                        defined.add(n);
-                    }
-                }
-                List<String> subpath = new LinkedList<String>();
-                for (String key : config.getAllRepositories()) {
-                    if (!defined.contains(key))
-                    {
-                        subpath.add(key);
-                    }
-                }
-                scanRepositories(subpath, list);
-            }
-            else {
-                Properties props = config.getRepositoryConfig(name);
-                if (props != null) {
-                    String def = config.getRepositoryDefinition(name).toString();
-                    IBundleRepository repo = buildRepository(def, name, props);
-                    if ( repo != null ) {
-                        // filter singletons but maintain order
-                        if ( !list.contains(repo) ) {
-                            list.add(repo);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @param repo
-     * @return 
-     */
-    private IBundleRepository buildRepository(String def, String name, Properties repo)
-    {
-        String disabled = repo.getProperty("disabled", "false");
-        if (Boolean.parseBoolean(disabled.trim())) return null;
-        
-        String optStr = repo.getProperty("optional", "false");
-        boolean optional = Boolean.parseBoolean(optStr.trim());
-
-        String alias = repo.getProperty(IRepositoryConfig.REPOSITORY_PROVIDER);
-        if (alias == null)
-        {
-            String msg = "provider not specified for repository: " + def + "->" + name;
-            
-            if (optional)            
-                SigilCore.log(msg);
-            else
-                SigilCore.warn(msg);
-            
-            return null;
-        }
-
-        try
-        {
-            EclipseRepositoryProviderWrapper wrapper = EclipseRepositoryFactory.getProvider(alias);
-            String uid = wrapper.getType().isDynamic() ? def + "#" + name : wrapper.getType().getId();
-            IBundleRepository repository = repositoryCache.getRepository(uid, repo, wrapper);
-            return repository;
-        }
-        catch (Exception e)
-        {
-            String msg = "failed to create repository: ";
-            
-            if (optional)            
-                SigilCore.log(msg + e);
-            else
-                SigilCore.warn(msg, e);
-        }
-        
-        return null;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-     */
-    public void propertyChange(PropertyChangeEvent event)
-    {
-        if (event.getProperty().equals("repository.order"))
-        {
-            loadRepositories();
-        }
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseBundleRepository.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseBundleRepository.java
deleted file mode 100644
index 68f9263..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseBundleRepository.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-import java.util.HashSet;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.repository.AbstractBundleRepository;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IBundleRepositoryListener;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
-
-/**
- * @author dave
- *
- */
-public class EclipseBundleRepository extends AbstractBundleRepository implements IEclipseBundleRepository
-{
-    
-    private final IRepositoryProvider provider;
-    private final Properties properties;
-    private final IRepositoryType type;
-    
-    private final HashSet<IBundleRepositoryListener> listeners = new HashSet<IBundleRepositoryListener>();
-    
-    private Exception exception;
-    private IBundleRepository delegate;
-
-    /**
-     * @param provider
-     * @param type 
-     * @param id
-     * @param properties
-     */
-    public EclipseBundleRepository(IRepositoryProvider provider, IRepositoryType type, String id, Properties properties)
-    {
-        super(id);
-        this.provider = provider;
-        this.type = type;
-        this.properties = properties;
-    }
-    
-    private synchronized IBundleRepository getDelegate() {
-        if (delegate == null && exception == null) {
-            try
-            {
-                delegate = provider.createRepository(getId(), properties);
-                for (IBundleRepositoryListener listener : listeners) {
-                    delegate.addBundleRepositoryListener(listener);
-                }
-                exception = null;
-            }
-            catch (Exception e)
-            {
-                delegate = null;
-                exception = e;
-            }
-        }
-        
-        return delegate;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.repository.IBundleRepository#accept(org.apache.felix.sigil.common.repository.IRepositoryVisitor, int)
-     */
-    public void accept(IRepositoryVisitor visitor, int options)
-    {
-        IBundleRepository delegate = getDelegate();
-        if ( delegate != null ) {
-            delegate.accept(visitor, options);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.repository.IBundleRepository#addBundleRepositoryListener(org.apache.felix.sigil.common.repository.IBundleRepositoryListener)
-     */
-    public synchronized void addBundleRepositoryListener(IBundleRepositoryListener listener)
-    {
-        IBundleRepository delegate = getDelegate();
-        if ( delegate != null ) {
-            delegate.addBundleRepositoryListener(listener);
-        }
-        else {
-            listeners.add(listener);
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.repository.IBundleRepository#removeBundleRepositoryListener(org.apache.felix.sigil.common.repository.IBundleRepositoryListener)
-     */
-    public synchronized void removeBundleRepositoryListener(IBundleRepositoryListener listener)
-    {
-        IBundleRepository delegate = getDelegate();
-        if ( delegate != null ) {
-            delegate.removeBundleRepositoryListener(listener);
-        }
-        else {
-            listeners.remove(listener);
-        }
-    }    
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.repository.IBundleRepository#refresh()
-     */
-    public void refresh()
-    {
-        IBundleRepository delegate = getDelegate();
-        if ( delegate == null ) {
-            exception = null;
-            getDelegate();
-        }
-        else {
-            delegate.refresh();
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.eclipse.internal.repository.manager.IEclipseBundleRepository#getModel()
-     */
-    public IRepositoryModel getModel()
-    {
-        return new RepositoryModel(getId(), type, properties, exception);
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryFactory.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryFactory.java
deleted file mode 100644
index 65f65c8..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryFactory.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.internal.model.repository.ExtensionUtils;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-
-/**
- * @author dave
- *
- */
-public class EclipseRepositoryFactory
-{
-
-    static class EclipseRepositoryProviderWrapper implements IRepositoryProvider {
-        private final IRepositoryProvider delegate;
-        private final IRepositoryType type;
-
-        /**
-         * @param provider
-         * @param type 
-         */
-        public EclipseRepositoryProviderWrapper(IRepositoryProvider provider, IRepositoryType type)
-        {
-            this.delegate = provider;
-            this.type = type;
-        }
-
-        /* (non-Javadoc)
-         * @see org.apache.felix.sigil.common.repository.IRepositoryProvider#createRepository(java.lang.String, java.util.Properties)
-         */
-        public IBundleRepository createRepository(String id, Properties properties)
-        {
-            return new EclipseBundleRepository(delegate, type, id, properties);
-        }
-        
-        public IRepositoryType getType() {
-            return type;
-        }
-    }
-    /**
-     * @param alias
-     * @return
-     */
-    public static EclipseRepositoryProviderWrapper getProvider(String alias)
-    throws CoreException
-    {
-        IExtensionRegistry registry = Platform.getExtensionRegistry();
-        IExtensionPoint p = registry.getExtensionPoint(SigilCore.REPOSITORY_PROVIDER_EXTENSION_POINT_ID);
-
-        for (IExtension e : p.getExtensions())
-        {
-            for (IConfigurationElement c : e.getConfigurationElements())
-            {
-                if (alias.equals(c.getAttribute("alias")))
-                {
-                    IRepositoryProvider provider = (IRepositoryProvider) c.createExecutableExtension("class");
-                    IRepositoryType type = ExtensionUtils.toRepositoryType(e, c);
-                    return new EclipseRepositoryProviderWrapper(provider, type);
-                }
-            }
-        }
-
-        return null;
-    }
-    
-    
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/GlobalRepositoryConfig.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/GlobalRepositoryConfig.java
deleted file mode 100644
index b5ed778..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/GlobalRepositoryConfig.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * @author dave
- *
- */
-public class GlobalRepositoryConfig extends AbstractEclipseRepositoryConfig
-{
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryPath()
-     */
-    public List<String> getRepositoryPath()
-    {
-        return Collections.singletonList(IRepositoryConfig.WILD_CARD);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.eclipse.internal.repository.manager.AbstractEclipseRepositoryConfig#getConfigs()
-     */
-    @Override
-    protected IRepositoryConfig[] getConfigs()
-    {
-        ArrayList<IRepositoryConfig> list = new ArrayList<IRepositoryConfig>(); 
-        for (ISigilProjectModel p : SigilCore.getRoot().getProjects() ) {
-            try
-            {
-                IRepositoryConfig c = p.getRepositoryConfig();
-                list.add( c );
-            }
-            catch (CoreException e)
-            {
-                SigilCore.error("Failed to read repository config", e);
-            }            
-        }
-        return list.toArray( new IRepositoryConfig[list.size()] );
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/GlobalRepositoryManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/GlobalRepositoryManager.java
deleted file mode 100644
index 1aa8110..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/GlobalRepositoryManager.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-/**
- * @author dave
- *
- */
-public class GlobalRepositoryManager extends AbstractEclipseRepositoryManager
-{
-
-    /**
-     * @param repositoryMap
-     */
-    public GlobalRepositoryManager(IRepositoryCache repositoryMap)
-    {
-        super(new GlobalRepositoryConfig(), repositoryMap);
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IEclipseBundleRepository.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IEclipseBundleRepository.java
deleted file mode 100644
index e33dc9e..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IEclipseBundleRepository.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-
-/**
- * @author dave
- *
- */
-public interface IEclipseBundleRepository extends IBundleRepository
-{
-    IRepositoryModel getModel();
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IRepositoryCache.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IRepositoryCache.java
deleted file mode 100644
index dadf8d1..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IRepositoryCache.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-import java.util.Collection;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-import org.apache.felix.sigil.common.repository.RepositoryException;
-
-/**
- * @author dave
- *
- */
-public interface IRepositoryCache
-{
-    /**
-     * @param sponsor
-     * @param uid
-     * @param props
-     * @param instance
-     * @return
-     * @throws RepositoryException
-     */
-    IBundleRepository getRepository(String uid, Properties props,
-        IRepositoryProvider instance) throws RepositoryException;
-
-    /**
-     * @param flush
-     */
-    void discard(Collection<String> ids);
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/ProjectRepositoryConfig.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/ProjectRepositoryConfig.java
deleted file mode 100644
index 3cdfc8e..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/ProjectRepositoryConfig.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-import java.util.List;
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-
-/**
- * @author dave
- *
- */
-public class ProjectRepositoryConfig extends AbstractEclipseRepositoryConfig
-{
-
-    private final IRepositoryConfig projectConfig;
-    
-    public ProjectRepositoryConfig(IRepositoryConfig projectConfig) {
-        this.projectConfig = projectConfig;
-    }
-    
-    protected IRepositoryConfig[] getConfigs() {
-        return new IRepositoryConfig[] { projectConfig };
-    }
-    
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryPath()
-     */
-    public List<String> getRepositoryPath()
-    {
-        return projectConfig.getRepositoryPath();
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/ProjectRepositoryManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/ProjectRepositoryManager.java
deleted file mode 100644
index 895617b..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/ProjectRepositoryManager.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * @author dave
- *
- */
-public class ProjectRepositoryManager extends AbstractEclipseRepositoryManager
-{
-    /**
-     * @param model
-     * @param repositoryMap2 
-     * @throws CoreException 
-     */
-    public ProjectRepositoryManager(ISigilProjectModel model, IRepositoryCache repositoryMap) throws CoreException
-    {
-        super(new ProjectRepositoryConfig(model.getRepositoryConfig()), repositoryMap);
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryCache.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryCache.java
deleted file mode 100644
index 895eaba..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryCache.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.internal.repository.manager;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-import org.apache.felix.sigil.common.repository.RepositoryException;
-
-public class RepositoryCache implements IRepositoryCache
-{
-    public static class RepositoryStore
-    {
-        public final Properties pref;
-        public final IBundleRepository repo;
-
-        public RepositoryStore(Properties pref, IBundleRepository repo)
-        {
-            this.pref = pref;
-            this.repo = repo;
-        }
-    }
-
-    private HashMap<String, RepositoryStore> cachedRepositories = new HashMap<String, RepositoryStore>();
-
-    public synchronized void retainAll(Collection<String> ids)
-    {
-        for (Iterator<String> i = cachedRepositories.keySet().iterator(); i.hasNext();)
-        {
-            if (!ids.contains(i.next()))
-            {
-                i.remove();
-            }
-        }
-    }
-
-    public IBundleRepository getRepository(String uid, Properties pref,
-        IRepositoryProvider provider) throws RepositoryException
-    {
-        try
-        {
-            if (pref == null)
-            {
-                pref = new Properties();
-            }
-
-            RepositoryStore cache = get(uid);
-
-            if (cache == null || !cache.pref.equals(pref))
-            {
-                IBundleRepository repo = provider.createRepository(uid, pref);
-                cache = new RepositoryStore(pref, repo);
-                put(uid, cache);
-            }
-
-            return cache.repo;
-        }
-        catch (RuntimeException e)
-        {
-            throw new RepositoryException("Failed to build repositories", e);
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.eclipse.internal.repository.manager.IRepositoryCache#discard(java.util.Collection)
-     */
-    public void discard(Collection<String> ids)
-    {
-        cachedRepositories.keySet().removeAll(ids);
-    }
-    
-
-    private RepositoryStore get(String id)
-    {
-        return cachedRepositories.get(id);
-    }
-
-    private void put(String id, RepositoryStore cache)
-    {
-        cachedRepositories.put(id, cache);
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java
deleted file mode 100644
index 340d560..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.eclipse.internal.resources;
-
-import java.util.LinkedList;
-
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.job.ResolveProjectsJob;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-
-public class ProjectResourceListener implements IResourceChangeListener
-{
-    public static final int EVENT_MASKS = IResourceChangeEvent.PRE_DELETE
-        | IResourceChangeEvent.POST_CHANGE;
-    private final SigilProjectManager projectManager;
-
-    public ProjectResourceListener(SigilProjectManager projectManager)
-    {
-        this.projectManager = projectManager;
-    }
-
-    public void resourceChanged(IResourceChangeEvent event)
-    {
-        try
-        {
-            switch (event.getType())
-            {
-                case IResourceChangeEvent.PRE_REFRESH:
-                    handleRefresh(event);
-                    break;
-                case IResourceChangeEvent.PRE_DELETE:
-                    handlePreDelete(event);
-                    break;
-                case IResourceChangeEvent.POST_CHANGE:
-                    handlePostChange(event);
-                    break;
-            }
-
-            handleUpdate();
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to process resource change", e);
-        }
-    }
-
-    private void handleUpdate()
-    {
-        if (capabilities.size() > 0)
-        {
-            final LinkedList<ICapabilityModelElement> changes = new LinkedList<ICapabilityModelElement>(
-                capabilities);
-            capabilities.clear();
-
-            ResolveProjectsJob job = new ResolveProjectsJob(
-                ResourcesPlugin.getWorkspace(), changes);
-            job.schedule();
-        }
-    }
-
-    private void handleRefresh(IResourceChangeEvent event) throws CoreException
-    {
-        IResourceDelta delta = event.getDelta();
-        if (delta != null)
-        {
-            delta.accept(new IResourceDeltaVisitor()
-            {
-                public boolean visit(IResourceDelta delta) throws CoreException
-                {
-                    IResource resource = delta.getResource();
-                    if (resource instanceof IProject)
-                    {
-                        IProject project = (IProject) resource;
-                        if (SigilCore.isSigilProject(project))
-                        {
-                            readCapabilities(project);
-                        }
-                        // Recurse no more
-                        return false;
-                    }
-                    return true;
-                }
-            });
-        }
-    }
-
-    private LinkedList<ICapabilityModelElement> capabilities = new LinkedList<ICapabilityModelElement>();
-
-    private void handlePostChange(IResourceChangeEvent event) throws CoreException
-    {
-        IResourceDelta delta = event.getDelta();
-        if (delta != null)
-        {
-            delta.accept(new IResourceDeltaVisitor()
-            {
-                public boolean visit(IResourceDelta delta) throws CoreException
-                {
-                    IResource resource = delta.getResource();
-                    if (resource instanceof IProject)
-                    {
-                        IProject project = (IProject) resource;
-                        if (SigilCore.isSigilProject(project))
-                        {
-                            switch (delta.getKind())
-                            {
-                                case IResourceDelta.REMOVED:
-                                case IResourceDelta.ADDED:
-                                    readCapabilities(project);
-                                    break;
-                            }
-                        }
-                        // Recurse no more
-                        return false;
-                    }
-                    return true;
-                }
-            });
-        }
-    }
-
-    protected void handlePreDelete(IResourceChangeEvent event) throws CoreException
-    {
-        IResource resource = event.getResource();
-        if (resource instanceof IProject)
-        {
-            IProject project = (IProject) resource;
-            if (SigilCore.isSigilProject(project))
-            {
-                readCapabilities(project);
-                projectManager.flushSigilProject(project);
-            }
-        }
-    }
-
-    private void readCapabilities(IProject project) throws CoreException
-    {
-        ISigilProjectModel sigil = SigilCore.create(project);
-        sigil.visit(new IModelWalker()
-        {
-            public boolean visit(IModelElement element)
-            {
-                if (element instanceof ICapabilityModelElement)
-                {
-                    capabilities.add((ICapabilityModelElement) element);
-                }
-                return true;
-            }
-        });
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java
deleted file mode 100644
index 9af30af..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.eclipse.internal.resources;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryManager;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.internal.model.project.SigilProject;
-import org.apache.felix.sigil.eclipse.internal.repository.manager.ProjectRepositoryManager;
-import org.apache.felix.sigil.eclipse.internal.repository.manager.IRepositoryCache;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-
-public class SigilProjectManager
-{
-    private final HashMap<IProject, ISigilProjectModel> projects = new HashMap<IProject, ISigilProjectModel>();
-    private final HashMap<ISigilProjectModel, ProjectRepositoryManager> repositoryManagers = new HashMap<ISigilProjectModel, ProjectRepositoryManager>();    
-    private final IRepositoryCache repositoryCache;
-    
-    public SigilProjectManager(IRepositoryCache repositoryCache) {
-        this.repositoryCache = repositoryCache;
-    }
-
-    public ISigilProjectModel getSigilProject(IProject project) throws CoreException
-    {
-        if (project.hasNature(SigilCore.NATURE_ID))
-        {
-            ISigilProjectModel p = null;
-            synchronized (projects)
-            {
-                p = projects.get(project);
-                if (p == null)
-                {
-                    p = new SigilProject(project);
-                    projects.put(project, p);
-                }
-            }
-            return p;
-        }
-        else
-        {
-            throw SigilCore.newCoreException("Project " + project.getName()
-                + " is not a sigil project", null);
-        }
-    }
-
-    public void flushSigilProject(IProject project)
-    {
-        synchronized (projects)
-        {
-            ISigilProjectModel model = projects.remove(project);
-            ArrayList<String> flush = new ArrayList<String>();
-            if ( model != null ) {
-                ProjectRepositoryManager manager = repositoryManagers.remove(model);
-                manager.destroy();
-                for(IBundleRepository rep : manager.getRepositories()) {
-                    flush.add(rep.getId());
-                }
-            }
-            
-            for (ProjectRepositoryManager manager : repositoryManagers.values()) {
-                for(IBundleRepository rep : manager.getRepositories()) {
-                    flush.remove(rep.getId());
-                }
-            }
-            
-            repositoryCache.discard(flush);
-        }
-    }
-
-    /**
-     * @param model
-     * @param repositoryCache 
-     * @throws CoreException 
-     */
-    public IRepositoryManager getRepositoryManager(ISigilProjectModel model) throws CoreException
-    {
-        synchronized( projects ) {
-            ProjectRepositoryManager manager = repositoryManagers.get(model);
-            
-            if ( manager == null ) {
-                manager = new ProjectRepositoryManager(model, repositoryCache);                
-                repositoryManagers.put(model, manager);
-            }
-            
-            return manager;
-        }
-    }
-
-    /**
-     * 
-     */
-    public synchronized void destroy()
-    {
-        for(ProjectRepositoryManager man : repositoryManagers.values()) {
-            man.destroy();
-        }
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/job/ResolveProjectsJob.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/job/ResolveProjectsJob.java
deleted file mode 100644
index fcec425..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/job/ResolveProjectsJob.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.job;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.common.model.IRequirementModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-
-public class ResolveProjectsJob extends WorkspaceJob
-{
-    private final Collection<ISigilProjectModel> sigilProjects;
-    private final LinkedList<ICapabilityModelElement> capabilities;
-
-    public ResolveProjectsJob(IWorkspace workspace)
-    {
-        super("Resolving Sigil projects");
-        setRule(workspace.getRoot());
-        sigilProjects = SigilCore.getRoot().getProjects();
-        capabilities = null;
-    }
-
-    public ResolveProjectsJob(IWorkspace workspace, LinkedList<ICapabilityModelElement> capabilities)
-    {
-        super("Resolving Sigil projects");
-        this.capabilities = capabilities;
-        setRule(workspace.getRoot());
-        sigilProjects = SigilCore.getRoot().getProjects();
-    }
-
-    public ResolveProjectsJob(ISigilProjectModel project)
-    {
-        super("Resolving Sigil project");
-        setRule(project.getProject().getWorkspace().getRoot());
-        sigilProjects = Collections.singleton(project);
-        capabilities = null;
-    }
-
-    @Override
-    public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException
-    {
-        MultiStatus status = new MultiStatus(SigilCore.PLUGIN_ID, 0,
-            "Error resolving Sigil projects", null);
-
-        boolean flush = sigilProjects.size() > 0;
-
-        for (ISigilProjectModel sigilProject : sigilProjects)
-        {
-            try
-            {
-                if (isDependent(sigilProject))
-                {
-                    if (flush)
-                        sigilProject.flushDependencyState();
-                    sigilProject.rebuildDependencies(monitor);
-                }
-            }
-            catch (CoreException e)
-            {
-                status.add(e.getStatus());
-            }
-        }
-
-        return status;
-    }
-
-    private boolean isDependent(ISigilProjectModel sigilProject)
-    {
-        // fix for FELIX-2574
-        if (!sigilProject.exists()) return false;
-        
-        if (capabilities == null)
-        {
-            return true;
-        }
-        else
-        {
-            ISigilBundle b = sigilProject.getBundle();
-            if (b == null)
-            {
-                // sigil project deleted can't be a dependent
-                return false;
-            }
-            else
-            {
-                final boolean[] dep = new boolean[1];
-
-                b.visit(new IModelWalker()
-                {
-                    public boolean visit(IModelElement element)
-                    {
-                        if (element instanceof IRequirementModelElement)
-                        {
-                            IRequirementModelElement r = (IRequirementModelElement) element;
-
-                            for (ICapabilityModelElement c : capabilities)
-                            {
-                                if (r.accepts(c))
-                                {
-                                    dep[0] = true;
-                                    break;
-                                }
-                            }
-                        }
-                        // found a dependency stop walking
-                        return !dep[0];
-                    }
-                });
-
-                return dep[0];
-            }
-        }
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/job/ThreadProgressMonitor.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/job/ThreadProgressMonitor.java
deleted file mode 100644
index 033ba92..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/job/ThreadProgressMonitor.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.job;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-public class ThreadProgressMonitor
-{
-    private static ThreadLocal<IProgressMonitor> local = new ThreadLocal<IProgressMonitor>();
-
-    public static void setProgressMonitor(IProgressMonitor monitor)
-    {
-        local.set(monitor);
-    }
-
-    public static IProgressMonitor getProgressMonitor()
-    {
-        return local.get();
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilModelRoot.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilModelRoot.java
deleted file mode 100644
index 6d262aa..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilModelRoot.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.model.project;
-
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-public interface ISigilModelRoot
-{
-    List<ISigilProjectModel> getProjects();
-
-    Set<ISigilProjectModel> resolveDependentProjects(
-        Collection<ICapabilityModelElement> caps, IProgressMonitor monitor);
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java
deleted file mode 100644
index a57f098..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.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.sigil.eclipse.model.project;
-
-import java.util.Collection;
-
-import org.apache.felix.sigil.common.config.IBldProject;
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.model.ICompoundModelElement;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.repository.IRepositoryManager;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.JavaModelException;
-import org.osgi.framework.Version;
-
-/**
- * Represents a sigil project. To get a reference to a ISigilProjectModel you can use the 
- * helper method {@link BldCore#create(IProject)}.
- * 
- * @author dave
- *
- */
-public interface ISigilProjectModel extends ICompoundModelElement
-{
-
-    /**
-     * @return
-     */
-    IProject getProject();
-
-    // shortcut to getProject().getName()
-    String getName();
-
-    /**
-     * 
-     * @param monitor
-     *            The progress monitor to use for reporting progress to the
-     *            user. It is the caller's responsibility to call done() on the
-     *            given monitor. Accepts null, indicating that no progress
-     *            should be reported and that the operation cannot be cancelled
-     * @throws CoreException
-     */
-    void save(IProgressMonitor monitor) throws CoreException;
-
-    /**
-     * Save the project and optionally rebuildDependencies
-     * @param monitor
-     * @param rebuildDependencies
-     * @throws CoreException
-     */
-    void save(IProgressMonitor monitor, boolean rebuildDependencies) throws CoreException;
-
-    void rebuildDependencies(IProgressMonitor monitor) throws CoreException;
-
-    void flushDependencyState();
-
-    /**
-     * @return
-     */
-    Version getVersion();
-
-    String getSymbolicName();
-
-    ISigilBundle getBundle();
-
-    void setBundle(ISigilBundle bundle);
-
-    /**
-     * @return
-     */
-    IJavaProject getJavaModel();
-
-    void resetClasspath(IProgressMonitor monitor, boolean forceResolve) throws CoreException;
-
-    IPath findBundleLocation() throws CoreException;
-
-    IModelElement findImport(String packageName, IProgressMonitor monitor);
-
-    boolean isInClasspath(String packageName, IProgressMonitor monitor)
-        throws CoreException;
-
-    boolean isInClasspath(ISigilBundle bundle);
-
-    boolean isInBundleClasspath(IPackageFragment root) throws JavaModelException;
-
-    IPath findOutputLocation() throws CoreException;
-
-    IBldProject getBldProject() throws CoreException;
-
-    /**
-     * @return
-     */
-    IRepositoryConfig getRepositoryConfig() throws CoreException;
-    
-    Collection<IClasspathEntry> findExternalClasspath(IProgressMonitor monitor)
-        throws CoreException;
-
-    /**
-     * @return
-     * @throws CoreException 
-     */
-    IRepositoryManager getRepositoryManager();
-
-    /**
-     * @return
-     */
-    boolean exists();
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryModel.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryModel.java
deleted file mode 100644
index 27d9723..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryModel.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.model.repository;
-
-import java.util.Properties;
-
-public interface IRepositoryModel
-{
-    String getId();
-
-    String getName();
-
-    Properties getProperties();
-
-    IRepositoryType getType();
-    
-    Throwable getProblem();
-}
\ No newline at end of file
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryPreferences.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryPreferences.java
deleted file mode 100644
index de40e56..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryPreferences.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.model.repository;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-public interface IRepositoryPreferences
-{
-    List<IRepositoryModel> loadRepositories();
-
-    void saveRepositories(List<IRepositoryModel> repositories) throws CoreException;
-
-    List<IRepositoryType> loadRepositoryTypes();
-    
-    IPreferenceStore toPreferenceStore(IRepositoryModel model);
-
-    IRepositoryModel newRepositoryElement(IRepositoryType type);
-}
\ No newline at end of file
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java
deleted file mode 100644
index e1e4987..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.model.repository;
-
-import org.eclipse.swt.graphics.Image;
-
-public interface IRepositoryType
-{
-
-    String getName();
-
-    String getId();
-
-    Image getIcon();
-
-    boolean isDynamic();
-
-    String getProvider();
-}
\ No newline at end of file
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/Grep.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/Grep.java
deleted file mode 100644
index 01faa5c..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/Grep.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.model.util;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.nio.CharBuffer;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-
-public class Grep
-{
-
-    // Pattern used to parse lines
-    private static Pattern linePattern = Pattern.compile(".*\r?\n");
-
-    // The input pattern that we're looking for
-    private Pattern pattern;
-
-    private CharBuffer cb;
-
-    private FileChannel fc;
-
-    private Grep(IFile f, Pattern pattern) throws IOException, CoreException
-    {
-        this.pattern = pattern;
-        cb = openBuffer(f);
-    }
-
-    private CharBuffer openBuffer(IFile f) throws IOException, CoreException
-    {
-        Charset charset = Charset.forName(f.getCharset());
-        CharsetDecoder decoder = charset.newDecoder();
-        // Open the file and then get a channel from the stream
-        FileInputStream fis = new FileInputStream(f.getLocation().toFile());
-        fc = fis.getChannel();
-
-        // Get the file's size and then map it into memory
-        int sz = (int) fc.size();
-        MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);
-
-        // Decode the file into a char buffer
-        return decoder.decode(bb);
-    }
-
-    public static String[] grep(Pattern pattern, IFile... files) throws CoreException
-    {
-        LinkedList<String> matches = new LinkedList<String>();
-        for (IFile f : files)
-        {
-            try
-            {
-                Grep g = new Grep(f, pattern);
-                g.grep(matches);
-                g.close();
-            }
-            catch (IOException e)
-            {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-        }
-        return matches.toArray(new String[matches.size()]);
-    }
-
-    private void close() throws IOException
-    {
-        fc.close();
-    }
-
-    // Use the linePattern to break the given CharBuffer into lines, applying
-    // the input pattern to each line to see if we have a match
-    //
-    private void grep(List<String> matches)
-    {
-        Matcher lm = linePattern.matcher(cb); // Line matcher
-        Matcher pm = null; // Pattern matcher
-        int lines = 0;
-        while (lm.find())
-        {
-            lines++;
-            CharSequence cs = lm.group(); // The current line
-            if (pm == null)
-                pm = pattern.matcher(cs);
-            else
-                pm.reset(cs);
-            if (pm.find())
-                matches.add(pm.group());
-            if (lm.end() == cb.limit())
-                break;
-        }
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java
deleted file mode 100644
index ba1b938..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java
+++ /dev/null
@@ -1,1305 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.model.util;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-import java.util.regex.Pattern;
-
-import org.apache.felix.sigil.common.config.Resource;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.repository.IRepositoryManager;
-import org.apache.felix.sigil.common.repository.IResolution;
-import org.apache.felix.sigil.common.repository.ResolutionConfig;
-import org.apache.felix.sigil.common.repository.ResolutionException;
-import org.apache.felix.sigil.eclipse.PathUtil;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.progress.ProgressAdapter;
-import org.apache.felix.sigil.eclipse.repository.ResolutionMonitorAdapter;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IAccessRule;
-import org.eclipse.jdt.core.IAnnotation;
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.IClasspathAttribute;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IImportDeclaration;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.ILocalVariable;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IParent;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.ITypeRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.osgi.framework.Version;
-
-/**
- * @author dave
- *
- */
-public class JavaHelper
-{
-
-    public static final IAccessRule DENY_RULE = JavaCore.newAccessRule(new Path("**"),
-        IAccessRule.K_NON_ACCESSIBLE | IAccessRule.IGNORE_IF_BETTER);
-
-    public static final IAccessRule ALLOW_ALL_RULE = JavaCore.newAccessRule(
-        new Path("**"), IAccessRule.K_ACCESSIBLE);
-
-    private static Map<String, Collection<IClasspathEntry>> entryCache = new HashMap<String, Collection<IClasspathEntry>>();
-
-    public static Collection<IClasspathEntry> findClasspathEntries(ISigilBundle bundle)
-    {
-        LinkedList<IClasspathEntry> cp = new LinkedList<IClasspathEntry>();
-
-        ISigilProjectModel sp = bundle.getAncestor(ISigilProjectModel.class);
-
-        if (sp != null)
-        {
-            IJavaProject p = sp.getJavaModel();
-
-            for (String enc : bundle.getClasspathEntrys())
-            {
-                IClasspathEntry e = p.decodeClasspathEntry(enc);
-                if (e != null)
-                {
-                    cp.add(e);
-                }
-            }
-        }
-
-        return cp;
-    }
-
-    public static Collection<ICompilationUnit> findCompilationUnits(
-        ISigilProjectModel project) throws JavaModelException
-    {
-        LinkedList<ICompilationUnit> ret = new LinkedList<ICompilationUnit>();
-
-        IJavaProject java = project.getJavaModel();
-        for (IClasspathEntry cp : findClasspathEntries(project.getBundle()))
-        {
-            IPackageFragmentRoot[] roots = java.findPackageFragmentRoots(cp);
-            for (IPackageFragmentRoot rt : roots)
-            {
-                for (IJavaElement j : rt.getChildren())
-                {
-                    IPackageFragment p = (IPackageFragment) j;
-                    ICompilationUnit[] units = p.getCompilationUnits();
-                    for (ICompilationUnit u : units)
-                    {
-                        ret.add(u);
-                    }
-                }
-            }
-        }
-
-        return ret;
-    }
-
-    /**
-     * @param project 
-     * @param packageName
-     * @return
-     */
-    public static Collection<IPackageExport> findExportsForPackage(
-        ISigilProjectModel project, final String packageName)
-    {
-        final LinkedList<IPackageExport> results = new LinkedList<IPackageExport>();
-
-        project.getRepositoryManager().visit(new IModelWalker()
-        {
-            public boolean visit(IModelElement element)
-            {
-                if (element instanceof IPackageExport)
-                {
-                    IPackageExport e = (IPackageExport) element;
-                    if (e.getPackageName().equals(packageName))
-                    {
-                        results.add(e);
-                    }
-                }
-                return true;
-            }
-        });
-
-        return results;
-    }
-
-    public static String[] findUses(String packageName, ISigilProjectModel projectModel)
-        throws CoreException
-    {
-        ArrayList<String> uses = new ArrayList<String>();
-
-        for (final String dependency : findPackageDependencies(packageName, projectModel))
-        {
-            if (!dependency.equals(packageName))
-            {
-                final boolean[] found = new boolean[1];
-
-                projectModel.visit(new IModelWalker()
-                {
-
-                    public boolean visit(IModelElement element)
-                    {
-                        if (element instanceof IPackageImport)
-                        {
-                            IPackageImport pi = (IPackageImport) element;
-                            if (pi.getPackageName().equals(dependency))
-                            {
-                                found[0] = true;
-                            }
-                        }
-                        return !found[0];
-                    }
-                });
-
-                if (found[0])
-                {
-                    uses.add(dependency);
-                }
-            }
-        }
-
-        return uses.toArray(new String[uses.size()]);
-    }
-
-    private static String[] findPackageDependencies(String packageName,
-        ISigilProjectModel projectModel) throws CoreException
-    {
-        HashSet<String> imports = new HashSet<String>();
-
-        IPackageFragment p = (IPackageFragment) projectModel.getJavaModel().findElement(
-            new Path(packageName.replace('.', '/')));
-
-        if (p == null)
-        {
-            throw SigilCore.newCoreException("Unknown package " + packageName, null);
-        }
-        for (ICompilationUnit cu : p.getCompilationUnits())
-        {
-            scanImports(cu, imports);
-        }
-        for (IClassFile cf : p.getClassFiles())
-        {
-            scanImports(cf, imports);
-        }
-
-        return imports.toArray(new String[imports.size()]);
-    }
-
-    /**
-     * @param project
-     * @param monitor
-     * @return
-     */
-    public static List<IPackageImport> findRequiredImports(ISigilProjectModel project,
-        IProgressMonitor monitor)
-    {
-        LinkedList<IPackageImport> imports = new LinkedList<IPackageImport>();
-        Set<String> names = findJavaImports(project, monitor);
-        if ( !monitor.isCanceled() ) {
-            for (String packageName : names)
-            {
-                if (!ProfileManager.isBootDelegate(project, packageName))
-                { // these must come from boot classloader
-                    try
-                    {
-                        if (!project.isInClasspath(packageName, monitor))
-                        {
-                            Collection<IPackageExport> exports = findExportsForPackage(
-                                project, packageName);
-                            if (!exports.isEmpty())
-                            {
-                                imports.add(select(exports));
-                            }
-                        }
-                    }
-                    catch (CoreException e)
-                    {
-                        SigilCore.error("Failed to check classpath", e);
-                    }
-                }
-            }
-        }
-        return imports;
-    }
-
-    /**
-     * @param project
-     * @param monitor
-     * @return
-     */
-    public static Collection<IModelElement> findUnusedReferences(
-        final ISigilProjectModel project, final IProgressMonitor monitor)
-    {
-        final LinkedList<IModelElement> unused = new LinkedList<IModelElement>();
-
-        final Set<String> packages = findJavaImports(project, monitor);
-
-        if (!monitor.isCanceled()) {
-            project.visit(new IModelWalker()
-            {
-                public boolean visit(IModelElement element)
-                {
-                    if (element instanceof IPackageImport)
-                    {
-                        IPackageImport pi = (IPackageImport) element;
-                        if (!packages.contains(pi.getPackageName()))
-                        {
-                            unused.add(pi);
-                        }
-                    }
-                    else if (element instanceof IRequiredBundle)
-                    {
-                        IRequiredBundle rb = (IRequiredBundle) element;
-                        IRepositoryManager manager = project.getRepositoryManager();
-                        ResolutionConfig config = new ResolutionConfig(
-                            ResolutionConfig.INCLUDE_OPTIONAL
-                                | ResolutionConfig.IGNORE_ERRORS);
-                        try
-                        {
-                            IResolution r = manager.getBundleResolver().resolve(rb, config,
-                                new ResolutionMonitorAdapter(monitor));
-                            ISigilBundle bundle = r.getProvider(rb);
-                            boolean found = false;
-                            for (IPackageExport pe : bundle.getBundleInfo().getExports())
-                            {
-                                if (packages.contains(pe.getPackageName()))
-                                {
-                                    found = true;
-                                    break;
-                                }
-                            }
-
-                            if (!found)
-                            {
-                                unused.add(rb);
-                            }
-                        }
-                        catch (ResolutionException e)
-                        {
-                            SigilCore.error("Failed to resolve " + rb, e);
-                        }
-                    }
-                    return !monitor.isCanceled();
-                }
-            });
-        }
-
-        return unused;
-    }
-
-    public static Collection<IClasspathEntry> resolveClasspathEntrys(
-        ISigilProjectModel sigil, IProgressMonitor monitor) throws CoreException
-    {
-        if (monitor == null)
-        {
-            monitor = Job.getJobManager().createProgressGroup();
-            monitor.beginTask("Resolving classpath for " + sigil.getSymbolicName(), 2);
-        }
-
-        ArrayList<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
-
-        ResolutionConfig config = new ResolutionConfig(ResolutionConfig.INCLUDE_OPTIONAL
-            | ResolutionConfig.IGNORE_ERRORS | ResolutionConfig.INDEXED_ONLY
-            | ResolutionConfig.LOCAL_ONLY | ResolutionConfig.COMPILE_TIME);
-
-        IResolution resolution;
-        try
-        {
-            resolution = sigil.getRepositoryManager().getBundleResolver().resolve(
-                sigil, config, new ResolutionMonitorAdapter(monitor));
-        }
-        catch (ResolutionException e)
-        {
-            throw SigilCore.newCoreException("Failed to resolve dependencies", e);
-        }
-
-        monitor.worked(1);
-
-        Set<ISigilBundle> bundles = resolution.getBundles();
-        for (ISigilBundle bundle : bundles)
-        {
-            if (!sigil.getSymbolicName().equals(bundle.getBundleInfo().getSymbolicName()))
-            { // discard self reference...
-                List<IModelElement> matched = resolution.getMatchedRequirements(bundle);
-                for (IClasspathEntry cpe : buildClassPathEntry(sigil, bundle, bundles,
-                    matched, monitor))
-                {
-                    entries.add(cpe);
-                }
-            }
-        }
-
-        Collections.sort(entries, new Comparator<IClasspathEntry>()
-        {
-            public int compare(IClasspathEntry o1, IClasspathEntry o2)
-            {
-                return o1.toString().compareTo(o2.toString());
-            }
-        });
-
-        monitor.worked(1);
-        monitor.done();
-
-        return entries;
-    }
-
-    private static Collection<IClasspathEntry> buildClassPathEntry(
-        ISigilProjectModel project, ISigilBundle provider, Set<ISigilBundle> all,
-        List<IModelElement> requirements, IProgressMonitor monitor) throws CoreException
-    {
-        IAccessRule[] rules = buildAccessRules(project, provider, all, requirements);
-        IClasspathAttribute[] attrs = new IClasspathAttribute[0];
-
-        ISigilProjectModel other = provider.getAncestor(ISigilProjectModel.class);
-
-        try
-        {
-            if (other == null)
-            {
-                provider.synchronize(new ProgressAdapter(monitor));
-                return newBundleEntry(provider, rules, attrs, false);
-            }
-            else
-            {
-                return newProjectEntry(other, rules, attrs, false);
-            }
-        }
-        catch (IOException e)
-        {
-            throw SigilCore.newCoreException("Failed to synchronize " + provider, e);
-        }
-    }
-
-    private static Collection<IClasspathEntry> newProjectEntry(ISigilProjectModel n,
-        IAccessRule[] rules, IClasspathAttribute[] attributes, boolean export)
-        throws CoreException
-    {
-        ArrayList<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
-        entries.add(JavaCore.newProjectEntry(n.getProject().getFullPath(), rules, false,
-            attributes, export));
-        for (IClasspathEntry e : n.getJavaModel().getRawClasspath())
-        {
-            String encoded = n.getJavaModel().encodeClasspathEntry(e);
-            if ( n.getBundle().getClasspathEntrys().contains(encoded) ) {
-                switch (e.getEntryKind())
-                {
-                    case IClasspathEntry.CPE_LIBRARY:
-                        entries.add(JavaCore.newLibraryEntry(e.getPath(),
-                            e.getSourceAttachmentPath(), e.getSourceAttachmentRootPath(),
-                            rules, attributes, export));
-                        break;
-                    case IClasspathEntry.CPE_VARIABLE:
-                        IPath path = JavaCore.getResolvedVariablePath(e.getPath());
-                        if (path != null)
-                        {
-                            IPath spath = e.getSourceAttachmentPath();
-                            if (spath != null) {
-                                spath = JavaCore.getResolvedVariablePath(spath);
-                            }
-                            
-                            entries.add(JavaCore.newLibraryEntry(path,
-                                spath, e.getSourceAttachmentRootPath(),
-                                rules, attributes, export));
-                        }
-                        break;
-                }
-            }
-        }
-
-        return entries;
-    }
-
-    private static Collection<IClasspathEntry> newBundleEntry(ISigilBundle bundle,
-        IAccessRule[] rules, IClasspathAttribute[] attributes, boolean exported)
-        throws CoreException
-    {
-        String name = bundle.getBundleInfo().getSymbolicName();
-
-        if (bundle.getBundleInfo().getVersion() != null)
-        {
-            name += "_version_" + bundle.getBundleInfo().getVersion();
-        }
-
-        String cacheName = name + rules.toString();
-
-        Collection<IClasspathEntry> entries = null;
-
-        synchronized (entryCache)
-        {
-            entries = entryCache.get(cacheName);
-
-            if (entries == null)
-            {
-                IPath path = PathUtil.newPathIfExists(bundle.getLocation());
-
-                if (path == null)
-                {
-                    SigilCore.error("Found null path for " + bundle.getSymbolicName());
-                    entries = Collections.emptyList();
-                }
-                else
-                {
-                    entries = buildEntries(path, name, bundle, rules, attributes,
-                        exported);
-                }
-
-                entryCache.put(cacheName, entries);
-            }
-        }
-
-        return entries;
-    }
-
-    private static IPath bundleCache = SigilCore.getDefault().getStateLocation().append(
-        "bundle-cache");
-
-    public static boolean isCachedBundle(String bp)
-    {
-        return bp.startsWith(bundleCache.toOSString());
-    }
-
-    private static Collection<IClasspathEntry> buildEntries(IPath path, String name,
-        ISigilBundle bundle, IAccessRule[] rules, IClasspathAttribute[] attributes,
-        boolean exported) throws CoreException
-    {
-        if (path.toFile().isDirectory())
-        {
-            throw SigilCore.newCoreException("Bundle location cannot be a directory",
-                null);
-        }
-        else
-        {
-            // ok it's a jar could contain libs etc
-            try
-            {
-                IPath cache = bundleCache.append(name);
-                Collection<String> classpath = bundle.getBundleInfo().getClasspaths();
-                ArrayList<IClasspathEntry> entries = new ArrayList<IClasspathEntry>(
-                    classpath.size());
-                IPath source = PathUtil.newPathIfExists(bundle.getSourcePathLocation());
-                IPath rootPath = PathUtil.newPathIfNotNull(bundle.getSourceRootPath());
-
-                if (source != null && !source.toFile().exists())
-                {
-                    source = null;
-                }
-
-                if (!classpath.isEmpty())
-                {
-                    unpack(cache, bundle, classpath);
-                    for (String cp : classpath)
-                    {
-                        IPath p = ".".equals(cp) ? path : cache.append(cp);
-                        if (p.toFile().exists())
-                        {
-                            IClasspathEntry e = JavaCore.newLibraryEntry(p, source,
-                                rootPath, rules, attributes, exported);
-                            entries.add(e);
-                        }
-                    }
-                }
-                else
-                { // default classpath is .
-                    IClasspathEntry e = JavaCore.newLibraryEntry(path, source, rootPath,
-                        rules, attributes, exported);
-                    entries.add(e);
-                }
-                return entries;
-            }
-            catch (IOException e)
-            {
-                throw SigilCore.newCoreException("Failed to unpack bundle", e);
-            }
-        }
-    }
-
-    private static HashMap<IPath, Collection<String>> unpacked = new HashMap<IPath, Collection<String>>();
-
-    private static synchronized void unpack(IPath cache, ISigilBundle bundle,
-        Collection<String> classpath) throws IOException
-    {
-        Collection<String> check = unpacked.get(cache);
-
-        if (check == null || !check.equals(classpath))
-        {
-            if (classpath.size() == 1 && classpath.contains("."))
-            {
-                unpacked.put(cache, classpath);
-            }
-            else
-            {
-                // trim . from path to avoid check later in inClasspath
-                check = new HashSet<String>(classpath);
-                check.remove(".");
-
-                File dir = createEmptyDir(cache);
-                FileInputStream fin = null;
-                try
-                {
-                    fin = new FileInputStream(bundle.getLocation());
-                    JarInputStream in = new JarInputStream(fin);
-                    JarEntry entry;
-                    while ((entry = in.getNextJarEntry()) != null)
-                    {
-                        if (inClasspath(check, entry))
-                        {
-                            File f = new File(dir, entry.getName());
-                            if (entry.isDirectory())
-                            {
-                                createDir(f);
-                            }
-                            else
-                            {
-                                try
-                                {
-                                    File p = f.getParentFile();
-                                    createDir(p);
-                                    streamTo(in, f);
-                                }
-                                catch (RuntimeException e)
-                                {
-                                    SigilCore.error("Failed to unpack " + entry, e);
-                                }
-                            }
-                        }
-                    }
-                    unpacked.put(cache, classpath);
-                }
-                finally
-                {
-                    if (fin != null)
-                    {
-                        fin.close();
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @param classpath
-     * @param entry
-     * @return
-     */
-    private static boolean inClasspath(Collection<String> classpath, JarEntry entry)
-    {
-        for (String s : classpath)
-        {
-            if (entry.getName().startsWith(s))
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private static void createDir(File p) throws IOException
-    {
-        if (!p.exists())
-        {
-            if (!p.mkdirs())
-                throw new IOException("Failed to create directory " + p);
-        }
-    }
-
-    private static void streamTo(InputStream in, File f) throws IOException
-    {
-        FileOutputStream fos = new FileOutputStream(f);
-        try
-        {
-            byte[] buf = new byte[1024];
-            for (;;)
-            {
-                int r = in.read(buf);
-
-                if (r == -1)
-                    break;
-
-                fos.write(buf, 0, r);
-            }
-
-            fos.flush();
-        }
-        finally
-        {
-            try
-            {
-                fos.close();
-            }
-            catch (IOException e)
-            {
-                SigilCore.error("Failed to close stream", e);
-            }
-        }
-    }
-
-    private static File createEmptyDir(IPath cache)
-    {
-        File dir = cache.toFile();
-        if (dir.exists())
-        {
-            deleteAll(dir);
-        }
-
-        dir.mkdirs();
-        return dir;
-    }
-
-    private static void deleteAll(File file)
-    {
-        File[] sub = file.listFiles();
-        if (sub != null)
-        {
-            for (File f : sub)
-            {
-                deleteAll(f);
-            }
-        }
-        file.delete();
-    }
-
-    private static IAccessRule[] buildAccessRules(ISigilProjectModel project,
-        ISigilBundle bundle, Set<ISigilBundle> all, List<IModelElement> requirements)
-        throws JavaModelException
-    {
-        ArrayList<IAccessRule> rules = new ArrayList<IAccessRule>();
-
-        for (IModelElement e : requirements)
-        {
-            if (e instanceof IRequiredBundle)
-            {
-                IRequiredBundle host = project.getBundle().getBundleInfo().getFragmentHost();
-                if (host != null)
-                {
-                    if (host.equals(e))
-                    {
-                        return new IAccessRule[] { ALLOW_ALL_RULE };
-                    }
-                    else
-                    {
-                        return buildExportRules(bundle, all, requirements);
-                    }
-                }
-                else
-                {
-                    return buildExportRules(bundle, all, requirements);
-                }
-            }
-            else if (e instanceof IPackageImport)
-            {
-                IPackageImport pi = (IPackageImport) e;
-                String pckg = pi.getPackageName();
-                HashSet<String> pckgs = new HashSet<String>();
-                pckgs.add(pckg);
-                //findIndirectReferences(pckgs, pckg, project.getJavaModel(), project.getJavaModel());
-
-                for (String p : pckgs)
-                {
-                    rules.add(newPackageAccess(p));
-                }
-            }
-        }
-
-        rules.add(DENY_RULE);
-
-        return rules.toArray(new IAccessRule[rules.size()]);
-    }
-
-    private static IAccessRule[] buildExportRules(ISigilBundle bundle,
-        Set<ISigilBundle> all, List<IModelElement> requirements)
-    {
-        Set<IPackageExport> ex = mergeExports(bundle, all, requirements);
-
-        IAccessRule[] rules = new IAccessRule[ex.size() + 1];
-
-        Iterator<IPackageExport> iter = ex.iterator();
-        for (int i = 0; i < rules.length - 1; i++)
-        {
-            IPackageExport p = iter.next();
-            rules[i] = JavaCore.newAccessRule(new Path(p.getPackageName().replace('.',
-                '/')).append("*"), IAccessRule.K_ACCESSIBLE);
-        }
-
-        rules[rules.length - 1] = DENY_RULE;
-
-        return rules;
-    }
-
-    private static Set<IPackageExport> mergeExports(ISigilBundle bundle,
-        Set<ISigilBundle> all, List<IModelElement> requirements)
-    {
-        IBundleModelElement headers = bundle.getBundleInfo();
-        // FIXME treeset as PackageExport does not implement equals/hashCode
-        TreeSet<IPackageExport> exports = new TreeSet<IPackageExport>(
-            headers.getExports());
-        IRequiredBundle host = headers.getFragmentHost();
-        if (host != null)
-        {
-            for (ISigilBundle b : all)
-            {
-                if (host.accepts(b.getBundleCapability()))
-                {
-                    exports.addAll(b.getBundleInfo().getExports());
-                    break;
-                }
-            }
-        }
-        return exports;
-    }
-
-    /*
-     * Searches for C (and D, E, etc) in case:
-     * A extends B extends C where A, B and C are in different packages and A is in this bundle
-     * and B and C are in one or more external bundles
-     */
-    private static void findIndirectReferences(Set<String> indirect, String pckg,
-        IParent parent, IJavaProject p) throws JavaModelException
-    {
-        for (IJavaElement e : parent.getChildren())
-        {
-            boolean skip = false;
-            switch (e.getElementType())
-            {
-                case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-                    IPackageFragmentRoot rt = (IPackageFragmentRoot) e;
-                    IClasspathEntry ce = rt.getRawClasspathEntry();
-                    IPath path = ce.getPath();
-                    skip = "org.eclipse.jdt.launching.JRE_CONTAINER".equals(path.toString());
-                    break;
-                case IJavaElement.CLASS_FILE:
-                    IClassFile cf = (IClassFile) e;
-                    if (cf.getElementName().startsWith(pckg))
-                    {
-                        findIndirectReferences(indirect,
-                            findPackage(cf.getType().getSuperclassName()), p, p);
-                    }
-                    break;
-                case IJavaElement.COMPILATION_UNIT:
-                    ICompilationUnit cu = (ICompilationUnit) e;
-                    break;
-            }
-
-            if (!skip && e instanceof IParent)
-            {
-                IParent newParent = (IParent) e;
-                findIndirectReferences(indirect, pckg, newParent, p);
-            }
-        }
-    }
-
-    private static IAccessRule newPackageAccess(String packageName)
-    {
-        return JavaCore.newAccessRule(
-            new Path(packageName.replace('.', '/')).append("*"), IAccessRule.K_ACCESSIBLE);
-    }
-
-    private static Set<String> findJavaImports(ISigilProjectModel project,
-        IProgressMonitor monitor)
-    {
-        Set<String> imports = new HashSet<String>();
-
-        findJavaModelImports(project, imports, monitor);
-        if ( !monitor.isCanceled() ) {
-            findTextImports(project, imports, monitor);
-        }
-
-        return imports;
-    }
-
-    private static void findTextImports(ISigilProjectModel project, Set<String> imports,
-        IProgressMonitor monitor)
-    {
-        IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
-        IContentType txt = contentTypeManager.getContentType("org.eclipse.core.runtime.text");
-        for (Resource p : project.getBundle().getSourcePaths())
-        {
-            IFile f = project.getProject().getFile(p.getLocalFile());
-            if (f.exists())
-            {
-                try
-                {
-                    IContentDescription desc = f.getContentDescription();
-                    if (desc != null)
-                    {
-                        IContentType type = desc.getContentType();
-                        if (type != null)
-                        {
-                            if (type.isKindOf(txt))
-                            {
-                                parseText(f, imports);
-                            }
-                        }
-                    }
-                }
-                catch (CoreException e)
-                {
-                    SigilCore.error("Failed to parse text file " + f, e);
-                }
-            }
-        }
-    }
-
-    private static void findJavaModelImports(ISigilProjectModel project,
-        Set<String> imports, IProgressMonitor monitor)
-    {
-        try
-        {
-            for (IPackageFragment root : project.getJavaModel().getPackageFragments())
-            {
-                if ( monitor.isCanceled() ) {
-                    return;
-                }
-                
-                IPackageFragmentRoot rt = (IPackageFragmentRoot) root.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
-
-                if (isInClassPath(project, rt))
-                {
-                    for (ICompilationUnit cu : root.getCompilationUnits())
-                    {
-                        scanImports(cu, imports);
-                    }
-
-                    for (IClassFile cf : root.getClassFiles())
-                    {
-                        scanImports(cf, imports);
-                    }
-                }
-            }
-        }
-        catch (JavaModelException e)
-        {
-            SigilCore.error("Failed to parse java model", e);
-        }
-    }
-
-    // matches word.word.word.word.Word
-    private static final Pattern JAVA_CLASS_PATTERN = Pattern.compile("((\\w*\\.\\w*)+?)\\.[A-Z]\\w*");
-
-    private static void parseText(IFile f, Set<String> imports) throws CoreException
-    {
-        for (String result : Grep.grep(JAVA_CLASS_PATTERN, f))
-        {
-            findImport(result, imports);
-        }
-    }
-
-    private static boolean isInClassPath(ISigilProjectModel project,
-        IPackageFragmentRoot rt) throws JavaModelException
-    {
-        String path = encode(project, rt.getRawClasspathEntry());
-        return project.getBundle().getClasspathEntrys().contains(path);
-    }
-
-    private static String encode(ISigilProjectModel project, IClasspathEntry cp)
-    {
-        return project.getJavaModel().encodeClasspathEntry(cp).trim();
-    }
-
-    private static void scanImports(IParent parent, Set<String> imports)
-        throws JavaModelException
-    {
-        for (IJavaElement e : parent.getChildren())
-        {
-            switch (e.getElementType())
-            {
-                case IJavaElement.TYPE:
-                    handleType((IType) e, imports);
-                    break;
-                case IJavaElement.IMPORT_DECLARATION:
-                    handleImport((IImportDeclaration) e, imports);
-                    break;
-                case IJavaElement.FIELD:
-                    handleField((IField) e, imports);
-                    break;
-                case IJavaElement.LOCAL_VARIABLE:
-                    handleLocalVariable((ILocalVariable) e, imports);
-                    break;
-                case IJavaElement.ANNOTATION:
-                    handleAnnotation((IAnnotation) e, imports);
-                    break;
-                case IJavaElement.METHOD:
-                    handleMethod((IMethod) e, imports);
-                    break;
-                default:
-                    // no action
-                    break;
-            }
-
-            if (e instanceof IParent)
-            {
-                scanImports((IParent) e, imports);
-            }
-        }
-    }
-
-    private static void handleType(IType e, Set<String> imports)
-        throws JavaModelException
-    {
-        findImportFromType(e.getSuperclassTypeSignature(), imports);
-        for (String sig : e.getSuperInterfaceTypeSignatures())
-        {
-            findImportFromType(sig, imports);
-        }
-        //findImportsForSuperTypes(e, imports);
-    }
-
-    /*private static void findImportsForSuperTypes(IType e, Set<String> imports) throws JavaModelException {
-    	IJavaProject project = (IJavaProject) e.getAncestor(IJavaModel.JAVA_PROJECT);
-    	LinkedList<String> types = new LinkedList<String>();
-    	types.add( decodeSignature(e.getSuperclassTypeSignature()) );
-    	for ( String sig : e.getSuperInterfaceTypeSignatures() ) {
-    		types.add( decodeSignature(sig) );
-    	}
-    	
-    	for ( IPackageFragmentRoot root : project.getPackageFragmentRoots() ) {
-    		// only need to search binary files for inheritance as source will automatically be searched
-    		if ( root.getKind() == IPackageFragmentRoot.K_BINARY ) {
-    			for ( String t : types ) {
-    				String pac = findPackage(t);
-    				if ( pac != null ) {
-    					IPackageFragment fragment = root.getPackageFragment(pac);
-    					if ( fragment != null ) {
-    						IClassFile c = fragment.getClassFile(findClass(t));
-    						if ( c != null ) {
-    							findImportsForSuperTypes(c.getType(), imports);
-    						}
-    					}
-    				}
-    			}
-    		}
-    	}
-    } */
-
-    private static void handleMethod(IMethod e, Set<String> imports)
-        throws JavaModelException
-    {
-        findImportFromType(e.getReturnType(), imports);
-
-        for (String param : e.getParameterTypes())
-        {
-            findImportFromType(param, imports);
-        }
-
-        for (String ex : e.getExceptionTypes())
-        {
-            findImportFromType(ex, imports);
-        }
-    }
-
-    private static void handleAnnotation(IAnnotation e, Set<String> imports)
-    {
-        findImport(e.getElementName(), imports);
-    }
-
-    private static void handleLocalVariable(ILocalVariable e, Set<String> imports)
-    {
-        findImportFromType(e.getTypeSignature(), imports);
-    }
-
-    private static void handleField(IField e, Set<String> imports)
-        throws IllegalArgumentException, JavaModelException
-    {
-        findImportFromType(Signature.getElementType(e.getTypeSignature()), imports);
-    }
-
-    private static void handleImport(IImportDeclaration id, Set<String> imports)
-    {
-        findImport(id.getElementName(), imports);
-    }
-
-    private static void findImportFromType(String type, Set<String> imports)
-    {
-        String element = decodeSignature(type);
-        findImport(element, imports);
-    }
-
-    private static String decodeSignature(String type)
-    {
-        return decodeSignature(type, false);
-    }
-
-    private static String decodeSignature(String type, boolean resolve)
-    {
-        if (type == null)
-        {
-            return null;
-        }
-
-        if (type.length() > 0)
-        {
-            switch (type.charAt(0))
-            {
-                case Signature.C_ARRAY:
-                    return decodeSignature(type.substring(1));
-                case Signature.C_UNRESOLVED:
-                    return resolve ? resolve(type.substring(1, type.length() - 1)) : null;
-                case Signature.C_RESOLVED:
-                    return type.substring(1);
-            }
-        }
-        return type;
-    }
-
-    private static String resolve(String substring)
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    private static void findImport(String clazz, Set<String> imports)
-    {
-        String packageName = findPackage(clazz);
-        if (packageName != null)
-        {
-            imports.add(packageName);
-        }
-    }
-
-    private static String findPackage(String clazz)
-    {
-        if (clazz == null)
-            return null;
-        int pos = clazz.lastIndexOf('.');
-        return pos == -1 ? null : clazz.substring(0, pos);
-    }
-
-    private static String findClass(String clazz)
-    {
-        if (clazz == null)
-            return null;
-        int pos = clazz.lastIndexOf('.');
-        return pos == -1 ? null : clazz.substring(pos + 1);
-    }
-
-    private static IPackageImport select(Collection<IPackageExport> proposals)
-    {
-        IPackageExport pe = null;
-
-        for (IPackageExport check : proposals)
-        {
-            if (pe == null || check.getVersion().compareTo(pe.getVersion()) > 0)
-            {
-                pe = check;
-            }
-        }
-
-        String packageName = pe.getPackageName();
-
-        Version version = pe.getVersion();
-        VersionRange versions = ModelHelper.getDefaultRange(version);
-
-        IPackageImport pi = ModelElementFactory.getInstance().newModelElement(
-            IPackageImport.class);
-        pi.setPackageName(packageName);
-        pi.setVersions(versions);
-
-        return pi;
-    }
-
-    public static Iterable<IJavaElement> findTypes(IParent parent, int... type)
-        throws JavaModelException
-    {
-        LinkedList<IJavaElement> found = new LinkedList<IJavaElement>();
-        scanForElement(parent, type, found, false);
-        return found;
-    }
-
-    public static IJavaElement findType(IParent parent, int... type)
-        throws JavaModelException
-    {
-        LinkedList<IJavaElement> found = new LinkedList<IJavaElement>();
-        scanForElement(parent, type, found, true);
-        return found.isEmpty() ? null : found.getFirst();
-    }
-
-    private static void scanForElement(IParent parent, int[] type,
-        List<IJavaElement> roots, boolean thereCanBeOnlyOne) throws JavaModelException
-    {
-        for (IJavaElement e : parent.getChildren())
-        {
-            if (isType(type, e))
-            {
-                roots.add(e);
-                if (thereCanBeOnlyOne)
-                {
-                    break;
-                }
-            }
-            else if (e instanceof IParent)
-            {
-                scanForElement((IParent) e, type, roots, thereCanBeOnlyOne);
-            }
-        }
-    }
-
-    private static boolean isType(int[] type, IJavaElement e)
-    {
-        for (int i : type)
-        {
-            if (i == e.getElementType())
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static boolean isAssignableTo(String ifaceOrParentClass, IType type)
-        throws JavaModelException
-    {
-        if (ifaceOrParentClass == null)
-            return true;
-
-        ITypeHierarchy h = type.newSupertypeHierarchy(null);
-
-        for (IType superType : h.getAllClasses())
-        {
-            String name = superType.getFullyQualifiedName();
-            if (name.equals(ifaceOrParentClass))
-            {
-                return true;
-            }
-        }
-        for (IType ifaceType : h.getAllInterfaces())
-        {
-            String name = ifaceType.getFullyQualifiedName();
-            if (name.equals(ifaceOrParentClass))
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private static IType findType(ITypeRoot root) throws JavaModelException
-    {
-        // TODO Auto-generated method stub
-        for (IJavaElement child : root.getChildren())
-        {
-            if (child.getElementType() == IJavaElement.TYPE)
-            {
-                return (IType) child;
-            }
-        }
-
-        throw new JavaModelException(
-            new IllegalStateException("Missing type for " + root), IStatus.ERROR);
-    }
-
-    public static Set<String> findLocalPackageDependencies(ISigilProjectModel project,
-        String packageName, IProgressMonitor monitor) throws JavaModelException
-    {
-        Set<String> imports = findJavaImports(project, monitor);
-        imports.remove(packageName);
-        return imports;
-    }
-
-    public static Set<String> findLocalPackageUsers(ISigilProjectModel project,
-        String packageName, IProgressMonitor monitor) throws JavaModelException
-    {
-        Set<String> imports = new HashSet<String>();
-        Set<String> check = new HashSet<String>();
-        for (IPackageFragment root : project.getJavaModel().getPackageFragments())
-        {
-            IPackageFragmentRoot rt = (IPackageFragmentRoot) root.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
-
-            if (isInClassPath(project, rt))
-            {
-                for (ICompilationUnit cu : root.getCompilationUnits())
-                {
-                    IPackageFragment pack = (IPackageFragment) cu.getAncestor(IJavaModel.PACKAGE_FRAGMENT);
-                    if (!pack.getElementName().equals(packageName))
-                    {
-                        scanImports(cu, check);
-                        if (check.contains(packageName))
-                        {
-                            imports.add(pack.getElementName());
-                        }
-                    }
-                    check.clear();
-                }
-
-                for (IClassFile cf : root.getClassFiles())
-                {
-                    IPackageFragment pack = (IPackageFragment) cf.getAncestor(IJavaModel.PACKAGE_FRAGMENT);
-                    if (!pack.getElementName().equals(packageName))
-                    {
-                        scanImports(cf, check);
-                        if (check.contains(packageName))
-                        {
-                            imports.add(pack.getElementName());
-                        }
-                    }
-                    check.clear();
-                }
-            }
-        }
-
-        return imports;
-    }
-}
\ No newline at end of file
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/ModelHelper.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/ModelHelper.java
deleted file mode 100644
index d05a47b..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/ModelHelper.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.model.util;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.ICapabilityModelElement;
-import org.apache.felix.sigil.common.model.ICompoundModelElement;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.common.model.IRequirementModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.osgi.VersionRangeBoundingRule;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.osgi.framework.Version;
-
-public class ModelHelper
-{
-    public static List<IModelElement> findUsers(IModelElement e)
-    {
-        LinkedList<IModelElement> users = new LinkedList<IModelElement>();
-
-        findUsers(e, users);
-
-        return users;
-    }
-
-    private static void findUsers(IModelElement e, final LinkedList<IModelElement> users)
-    {
-        if (e instanceof ICapabilityModelElement)
-        {
-            final ICapabilityModelElement cap = (ICapabilityModelElement) e;
-            SigilCore.getGlobalRepositoryManager().visit(new IModelWalker()
-            {
-                public boolean visit(IModelElement element)
-                {
-                    if (element instanceof IRequirementModelElement)
-                    {
-                        IRequirementModelElement req = (IRequirementModelElement) element;
-                        if (req.accepts(cap))
-                        {
-                            users.add(req);
-                        }
-                        return false;
-                    }
-
-                    return true;
-                }
-            });
-        }
-
-        if (e instanceof ICompoundModelElement)
-        {
-            ICompoundModelElement c = (ICompoundModelElement) e;
-            IModelElement[] ch = c.children();
-            for (IModelElement ee : ch)
-            {
-                findUsers(ee, users);
-            }
-        }
-    }
-
-    public static VersionRange getDefaultRange(Version version)
-    {
-        IPreferenceStore store = SigilCore.getDefault().getPreferenceStore();
-
-        VersionRangeBoundingRule lowerBoundRule = VersionRangeBoundingRule.valueOf(store.getString(SigilCore.DEFAULT_VERSION_LOWER_BOUND));
-        VersionRangeBoundingRule upperBoundRule = VersionRangeBoundingRule.valueOf(store.getString(SigilCore.DEFAULT_VERSION_UPPER_BOUND));
-
-        VersionRange selectedVersions = VersionRange.newInstance(version, lowerBoundRule,
-            upperBoundRule);
-        return selectedVersions;
-    }
-
-    public static IPackageExport findExport(ISigilProjectModel sigil,
-        final String packageName)
-    {
-        final ArrayList<IPackageExport> found = new ArrayList<IPackageExport>(1);
-        sigil.visit(new IModelWalker()
-        {
-            public boolean visit(IModelElement element)
-            {
-                if (element instanceof IPackageExport)
-                {
-                    IPackageExport pe = (IPackageExport) element;
-                    if (pe.getPackageName().equals(packageName))
-                    {
-                        found.add(pe);
-                    }
-                }
-                return found.isEmpty();
-            }
-        });
-        return found.isEmpty() ? null : found.get(0);
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/ProfileManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/ProfileManager.java
deleted file mode 100644
index 8c2455f..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/ProfileManager.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.model.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.regex.Pattern;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.utils.GlobCompiler;
-import org.eclipse.core.runtime.Platform;
-import org.osgi.framework.Bundle;
-
-class ProfileManager
-{
-    private static final Pattern[] BOOT_DELEGATION_PATTERNS = new Pattern[] {
-            GlobCompiler.compile("org.ietf.jgss"), GlobCompiler.compile("org.omg.*"),
-            GlobCompiler.compile("org.w3c.*"), GlobCompiler.compile("org.xml.*"),
-            GlobCompiler.compile("sun.*"), GlobCompiler.compile("com.sun.*"), };
-
-    private static HashMap<String, Properties> profiles;
-
-    static boolean isBootDelegate(ISigilProjectModel project, String packageName)
-    {
-        if (packageName.startsWith("java."))
-        {
-            return true;
-        }
-
-        for (Pattern p : BOOT_DELEGATION_PATTERNS)
-        {
-            if (p.matcher(packageName).matches())
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    static Properties findProfileForVersion(String javaVersion)
-    {
-        Map<String, Properties> profiles = loadProfiles();
-
-        if ("1.5.0".equals(javaVersion))
-        {
-            return profiles.get("J2SE-1.5");
-        }
-        else if ("1.6.0".equals(javaVersion))
-        {
-            return profiles.get("J2SE-1.6");
-        }
-
-        return null;
-    }
-
-    private synchronized static Map<String, Properties> loadProfiles()
-    {
-        if (profiles == null)
-        {
-            profiles = new HashMap<String, Properties>();
-
-            Bundle b = Platform.getBundle("org.eclipse.osgi");
-
-            for (String profile : loadProfiles(b))
-            {
-                if (profile.trim().length() > 0)
-                {
-                    URL url = findURL(profile, b);
-                    if (url != null)
-                    {
-                        try
-                        {
-                            Properties p = loadProperties(url);
-                            String name = p.getProperty("osgi.java.profile.name");
-                            if (name != null)
-                            {
-                                profiles.put(name, p);
-                            }
-                            else
-                            {
-                                SigilCore.error("Invalid profile definition, no name specified: "
-                                    + url);
-                            }
-                        }
-                        catch (IOException e)
-                        {
-                            SigilCore.error("Failed to load java profile", e);
-                        }
-                    }
-                    else
-                    {
-                        SigilCore.error("Unknown profile **" + profile + "**");
-                    }
-                }
-                // else ignore empty values
-            }
-        }
-        return profiles;
-    }
-
-    private static String[] loadProfiles(Bundle b)
-    {
-        URL url = findURL("profile.list", b);
-
-        if (url != null)
-        {
-            try
-            {
-                Properties p = loadProperties(url);
-                String s = p.getProperty("java.profiles");
-                return s == null ? new String[] {} : s.split(",");
-            }
-            catch (IOException e)
-            {
-                SigilCore.error("Failed to load java profile list", e);
-            }
-        }
-        else
-        {
-            SigilCore.error("Failed to find java profile list");
-        }
-
-        // fine no properties found
-        return new String[] {};
-    }
-
-    @SuppressWarnings("unchecked")
-    private static URL findURL(String file, Bundle b)
-    {
-        Enumeration e = b.findEntries("/", file, false);
-        return e == null ? null : (URL) (e.hasMoreElements() ? e.nextElement() : null);
-    }
-
-    private static Properties loadProperties(URL url) throws IOException
-    {
-        Properties p = new Properties();
-
-        InputStream in = null;
-
-        try
-        {
-            in = url.openStream();
-            p.load(in);
-        }
-        finally
-        {
-            if (in != null)
-            {
-                try
-                {
-                    in.close();
-                }
-                catch (IOException e)
-                {
-                    // TODO Auto-generated catch block
-                    e.printStackTrace();
-                }
-            }
-        }
-
-        return p;
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/nature/SigilProjectNature.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/nature/SigilProjectNature.java
deleted file mode 100644
index fb3ef0f..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/nature/SigilProjectNature.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.nature;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectNature;
-import org.eclipse.core.runtime.CoreException;
-
-public class SigilProjectNature implements IProjectNature
-{
-
-    private IProject project;
-
-    public void configure() throws CoreException
-    {
-        // TODO configure project builder
-
-    }
-
-    public void deconfigure() throws CoreException
-    {
-    }
-
-    public IProject getProject()
-    {
-        return project;
-    }
-
-    public void setProject(IProject project)
-    {
-        this.project = project;
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/PrefsUtils.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/PrefsUtils.java
deleted file mode 100644
index 14e7d57..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/PrefsUtils.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.preferences;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.lang.StringEscapeUtils;
-import org.apache.commons.lang.text.StrTokenizer;
-
-public class PrefsUtils
-{
-
-    private PrefsUtils()
-    {
-    }
-
-    public static final String arrayToString(String[] array)
-    {
-        StringBuilder builder = new StringBuilder();
-
-        for (int i = 0; i < array.length; i++)
-        {
-            if (i > 0)
-                builder.append(',');
-            builder.append(StringEscapeUtils.escapeCsv(array[i]));
-        }
-
-        return builder.toString();
-    }
-
-    public static final String[] stringToArray(String string)
-    {
-        StrTokenizer tokenizer = new StrTokenizer(string, ',', '"');
-        String[] array = new String[tokenizer.size()];
-
-        for (int i = 0; i < array.length; i++)
-        {
-            array[i] = tokenizer.nextToken();
-        }
-
-        return array;
-    }
-
-    public static String listToString(List<String> names)
-    {
-        return arrayToString(names.toArray(new String[names.size()]));
-    }
-
-    public static List<String> stringToList(String string)
-    {
-        return new ArrayList<String>(Arrays.asList(stringToArray(string)));
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/PromptablePreference.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/PromptablePreference.java
deleted file mode 100644
index e904bdc..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/PromptablePreference.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.preferences;
-
-public enum PromptablePreference
-{
-    Always, Prompt, Never
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/progress/ProgressAdapter.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/progress/ProgressAdapter.java
deleted file mode 100644
index 06216d0..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/progress/ProgressAdapter.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.progress;
-
-import org.apache.felix.sigil.common.progress.IProgress;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubMonitor;
-
-/**
- * @author dave
- *
- */
-public class ProgressAdapter implements IProgress
-{
-    
-    private final IProgressMonitor monitor;
-    private final SubMonitor sub;
-
-    public ProgressAdapter(IProgressMonitor monitor) {
-        this.monitor = monitor;
-        sub = SubMonitor.convert(monitor);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.progress.IProgress#done()
-     */
-    public void done()
-    {
-        monitor.done();
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.progress.IProgress#isCanceled()
-     */
-    public boolean isCanceled()
-    {
-        return monitor.isCanceled();
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.progress.IProgress#newChild(int)
-     */
-    public IProgress newChild(int totalWork)
-    {
-        return new ProgressAdapter(sub.newChild(totalWork));
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.progress.IProgress#newTask(int)
-     */
-    public IProgress newTask(int totalWork)
-    {
-        SubMonitor sub = SubMonitor.convert(monitor);
-        return new ProgressAdapter(sub);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.progress.IProgress#worked(int)
-     */
-    public void worked(int work)
-    {
-        monitor.worked(work);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.felix.sigil.common.progress.IProgress#report(java.lang.String)
-     */
-    public void report(String msg)
-    {
-        sub.subTask(msg);
-    }
-
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/repository/ResolutionMonitorAdapter.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/repository/ResolutionMonitorAdapter.java
deleted file mode 100644
index 0164e5a..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/repository/ResolutionMonitorAdapter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.repository;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.repository.IResolutionMonitor;
-
-public class ResolutionMonitorAdapter implements IResolutionMonitor
-{
-
-    private IProgressMonitor monitor;
-
-    public ResolutionMonitorAdapter() {
-        this.monitor = new NullProgressMonitor();
-    }
-    
-    public ResolutionMonitorAdapter(IProgressMonitor monitor)
-    {
-        this.monitor = monitor;
-    }
-
-    public boolean isCanceled()
-    {
-        return monitor.isCanceled();
-    }
-
-    public void startResolution(IModelElement requirement)
-    {
-        monitor.subTask("Resolving " + requirement);
-    }
-
-    public void endResolution(IModelElement requirement, ISigilBundle provider)
-    {
-        monitor.subTask((provider == null ? "Failed to resolve " : "Resolved ")
-            + requirement);
-    }
-
-}
diff --git a/sigil/eclipse/help/.classpath b/sigil/eclipse/help/.classpath
deleted file mode 100644
index 41d4818..0000000
--- a/sigil/eclipse/help/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="lib" path="lib/org.eclipse.swt.carbon.macosx.jar"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/eclipse/help/.project b/sigil/eclipse/help/.project
deleted file mode 100644
index 2688c0c..0000000
--- a/sigil/eclipse/help/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.eclipse.help</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/eclipse/help/.settings/org.eclipse.jdt.core.prefs b/sigil/eclipse/help/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 35ef172..0000000
--- a/sigil/eclipse/help/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,263 +0,0 @@
-#Thu Sep 17 16:09:23 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/eclipse/help/.settings/org.eclipse.jdt.ui.prefs b/sigil/eclipse/help/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index e354248..0000000
--- a/sigil/eclipse/help/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:09:24 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/eclipse/help/DEPENDENCIES b/sigil/eclipse/help/DEPENDENCIES
deleted file mode 100644
index 2691511..0000000
--- a/sigil/eclipse/help/DEPENDENCIES
+++ /dev/null
@@ -1,26 +0,0 @@
-Apache Felix Sigil Eclipse Help
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed by the The Eclipse Foundation
-(http://www.eclipse.org)
-Copyright © 2010 The Eclipse Foundation. All Rights Reserved.
-Licensed under the Eclipse Public License - v 1.0.
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
-- Eclipse Public License - v 1.0
diff --git a/sigil/eclipse/help/NOTICE b/sigil/eclipse/help/NOTICE
deleted file mode 100644
index 64a02ed..0000000
--- a/sigil/eclipse/help/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Eclipse Help
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/eclipse/help/build.xml b/sigil/eclipse/help/build.xml
deleted file mode 100644
index 01507c3..0000000
--- a/sigil/eclipse/help/build.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="eclipse.help" default="build"
-	  xmlns:ivy="antlib:org.apache.ivy.ant">
-  <import file="../build.xml"/>
-  <target name="init">
-    <ivy:retrieve organisation="org.eclipse" module="org.eclipse.swt.carbon.macosx" revision="3.4.1.v3452b" inline="true" pattern="lib/[artifact].[ext]" transitive="false"/>
-  </target>
-</project>
diff --git a/sigil/eclipse/help/cheatsheets/HelloWorld.xml b/sigil/eclipse/help/cheatsheets/HelloWorld.xml
deleted file mode 100644
index 94ce68d..0000000
--- a/sigil/eclipse/help/cheatsheets/HelloWorld.xml
+++ /dev/null
@@ -1,218 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<cheatsheet title="Create a Hello World composite application">
-	<intro>
-		<description>This cheat sheet shows you how to create a simple hello world composite application using Sigil.</description>
-	</intro>
-	
-	<item title="Create an empty Newton project" href="/org.cauldron.sigil.help/html/tasks/new_project.html" dialog="true" skip="true">
-		<description>
-		First, you must create a new &quot;org.example.helloworld&quot; empty Newton project to house the java classes and SCA composites.
-		</description>
-
-		<subitem label="Select &quot;File &gt;New &gt;Project...&quot;. Expand &quot;Sigil&quot;, select &quot;Newton Project&quot; and click &quot;Next&quot;." skip="true">
-			<action
-				pluginId="org.cauldron.sigil.help"
-				class="org.cauldron.sigil.cheatsheets.actions.OpenEmptyNewtonProjectWizardAction"
-				param1="org.example.helloworld"  
-				translate="" />
-		</subitem>
-
-		<subitem label="Enter &quot;org.example.helloworld&quot; as the &quot;Project name&quot;, then click &quot;Finish&quot;." skip="false" />
-	</item>
-	
-	<item title="Create The Java Interfaces and Classes" skip="true">
-		<description>
-		Create a new &quot;org.example.helloworld.api&quot; package and add a HelloWorld interface to this package. 
-		Then create a new &quot;org.example.helloworld.impl&quot; package and add a HelloWorldImpl class which implements HelloWorld to the impl package.
-		Finally create a new &quot;org.example.helloworld.cli&quot; package and add a HelloWorldCli class which references the HelloWorld api to the cli package.
-		</description>
-
-		<subitem label="Create the HelloWorld API" skip="true">
-			<action
-				pluginId="org.cauldron.sigil.help"
-				class="org.cauldron.sigil.cheatsheets.actions.CopyResourceFromPlugin"
-				param1="org.example.helloworld"  
-				param2="src/org/example/helloworld/api"
-				param3="org.cauldron.sigil.help"
-				param4="archive/java/HelloWorld.java"
-				param5="org.eclipse.jdt.ui.CompilationUnitEditor"
-				translate="" />
-		</subitem>
-		<subitem label="Create the HelloWorld Impl" skip="true">
-			<action
-				pluginId="org.cauldron.sigil.help"
-				class="org.cauldron.sigil.cheatsheets.actions.CopyResourceFromPlugin"
-				param1="org.example.helloworld"  
-				param2="src/org/example/helloworld/impl"
-				param3="org.cauldron.sigil.help"
-				param4="archive/java/HelloWorldImpl.java"   
-				param5="org.eclipse.jdt.ui.CompilationUnitEditor"
-				translate="" />
-		</subitem>
-		<subitem label="Create the HelloWorld CLI" skip="true">
-			<action
-				pluginId="org.cauldron.sigil.help"
-				class="org.cauldron.sigil.cheatsheets.actions.CopyResourceFromPlugin"
-				param1="org.example.helloworld"  
-				param2="src/org/example/helloworld/cli"
-				param3="org.cauldron.sigil.help"
-				param4="archive/java/HelloWorldCli.java"   
-				param5="org.eclipse.jdt.ui.CompilationUnitEditor"
-				translate="" />
-		</subitem>
-	</item>
-   <item
-         title="Add OSGi Package Imports To The HelloWorld Project">
-      <description>
-         The HelloWorldCli class references classes which are exported from other OSGi bundles. In order to satisfy the OSGi classloading rules the HelloWorld project must import the required packages.
-      </description>
-      <subitem
-            label="Open the &quot;org.example.helloworld&quot; project editor by double-clicking on the &quot;sigil.properties&quot; file in the project directory."
-            skip="false">
-      </subitem>
-      <subitem
-            label="Select the &quot;Overview&quot; tab.">
-      </subitem>
-      <subitem
-            label="Click on the &quot;Resolve missing dependencies&quot; link in the &quot;Tools&quot; section.">
-      </subitem>
-      <subitem
-            label="Wait for the background task to complete. When the &quot;Review New Imports&quot; dialog appears, click &quot;OK&quot;.">
-      </subitem>
-   </item>
-  
-	
-	<item title="Create The SCA Composites That Describe The Java Resources" skip="true">
-		<description>
-		Create a new HelloWorld service composite that exports the HelloWorldImpl class using the HelloWorld interface. 
-		Then create a new HelloWorld cli composite that imports the HelloWorld interface and exports a ConsoleCommandHandler 
-		service to allow user interaction via the command handler.
-		</description>
-
-		<subitem label="Create the HelloWorld Service" skip="true">
-			<action
-				pluginId="org.cauldron.sigil.help"
-				class="org.cauldron.sigil.cheatsheets.actions.CopyResourceFromPlugin"
-				param1="org.example.helloworld"
-				param2="sca"
-				param3="org.cauldron.sigil.help"
-				param4="archive/sca/org.example.helloworld.service.composite"
-				param5="org.cauldron.sigil.editors.SCACompositeEditor"   
-				translate="" />
-		</subitem>
-		<subitem label="Create the HelloWorld Command Line" skip="true">
-			<action
-				pluginId="org.cauldron.sigil.help"
-				class="org.cauldron.sigil.cheatsheets.actions.CopyResourceFromPlugin"
-				param1="org.example.helloworld"
-				param2="sca"
-				param3="org.cauldron.sigil.help"
-				param4="archive/sca/org.example.helloworld.cli.composite"   
-				param5="org.cauldron.sigil.editors.SCACompositeEditor"   
-				translate="" />
-		</subitem>
-	</item>
-	
-   <item
-         title="Add The SCA Composites To The HelloWorld Bundle">
-      <description>
-         In order to load a composite in a Newton container it needs to be associated with an OSGi bundle that will act as the classpath for that bundle.
-      </description>
-      <subitem
-            label="Open the &quot;org.example.helloworld&quot; project editor by double-clicking on the &quot;sigil.properties&quot; file in the project directory.">
-      </subitem>
-      <subitem
-            label="Select the &quot;Exports&quot; tab.">
-      </subitem>
-      <subitem
-            label="Click on the &quot;Add&quot; button in the Composites section.">
-      </subitem>
-      <subitem
-            label="Add the &quot;org.example.helloworld.service&quot; and &quot;org.example.helloworld.cli&quot; composites to the OSGi bundle.">
-      </subitem>
-      <subitem
-            label="Save the &quot;org.example.helloworld&quot; project editor.">
-      </subitem>
-   </item>
-	
- <item
-       title="Launch A Newton Container">
-    <description>
-       Launch a Newton enabled JVM in which to host the SCA composites you have just created.
-    </description>
-    <subitem
-          label="Make sure that the the &quot;org.example.helloworld&quot; project editor is open.">
-    </subitem>
-    <subitem
-          label="Select the &quot;Overview&quot; tab.">
-    </subitem>
-    <subitem
-          label="Click on the &quot;Launch a newton container&quot; link in the &quot;Testing&quot; section.">
-    </subitem>
-    <subitem
-          label="Wait for the newton container to finish launching. This is signified by the console message: &quot;Boot complete&quot;">
-    </subitem>
- </item>
-
- <item
-       title="Install The HelloWorld Composites In The Newton Container">
-    <description>
-       We will now install the two composites in the Newton container we just launched using the short-cut menu items in the eclipse navigation bar.
-    </description>
-    <subitem
-          label="Open the &quot;org.example.helloworld.service.composite&quot; document using the Sigil &quot;SCA Composite Editor&quot;.">
-    </subitem>
-    <subitem
-          label="Click on the &quot;Install Composite&quot; short-cut menu item in the navigation bar.">
-    </subitem>
-    <subitem
-          label="Select the &quot;org.example.helloworld&quot; instance and click ok">
-    </subitem>
-    <subitem
-          label="Open the &quot;org.example.helloworld.cli.composite&quot; document using the Sigil &quot;SCA Composite Editor&quot;.">
-    </subitem>
-    <subitem
-          label="Again, click on the &quot;Install Composite&quot; short-cut menu item in the navigation bar and install into the &quot;org.example.helloworld&quot; Newton instance.">
-    </subitem>
- </item>
-	
-	<item title="Type &quot;sayhello&quot; on the Newton console" skip="false">
-		<description>
-		
-		</description>
-  <subitem
-        label="Select the Newton console.">
-        <action
-				pluginId="org.cauldron.sigil.help"
-				class="org.cauldron.sigil.cheatsheets.actions.ShowViewAction"
-				param1="org.eclipse.ui.console.ConsoleView"
-				translate="" />
-        
-  </subitem>
-  <subitem
-        label="Type &quot;sayhello&quot;. You should see the response:&lt;br/&gt;Hello World">
-  </subitem>	
-	</item>	
-	
-	<onCompletion>Congratulations you have created your first composite application using Sigil.</onCompletion>
-	
-	
-</cheatsheet>
diff --git a/sigil/eclipse/help/html/book.html b/sigil/eclipse/help/html/book.html
deleted file mode 100644
index a9fc420..0000000
--- a/sigil/eclipse/help/html/book.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<html>
-<header>
-<title>Sigil - Newton Development Plugin</title>
-</header>
-<body bgcolor="#ffffff">
-<table width="100%">
-	<tr>
-		<td valign="bottom"><h1>Sigil - Newton Development Plugin</h1></td><td align="right"><img src="images/sigil.gif" /></td>
-	</tr>
-	<tr><td colspan="2">
-<p>Sigil is an eclipse plugin that helps developers build and test code to be deployed on the Newton platform</p>
-
-<p>Features:<br/>
-<ul>
-    <li>New (Newton Project, Composite, System)</li>
-    <li>Syntax highlighting and code completion for SCA/System docs</li>
-    <li>Launch Newton in Debug/Standard vm from Eclipse</li>
-    <li>Full debug support - break points/source code/step through etc</li>
-    <li>Install Composites into running newton from Eclipse</li>
-    <li>Log integration</li>
-</ul>
-</p>
-
-<div id="footer">
-<table cellpadding="4" cellspacing="0" border="0">
-<tr>
-<td><a href="http://www.paremus.com/License">
-          Copyright &copy; 2003-2007 Paremus Limited.</a>
-      All rights reserved.
-            <br>
-
-<script type="text/javascript" language="JavaScript"><!--
-              document.write(" - "+"Last Published: " + document.lastModified);
-              //  --></script>
-<div id="feedback">
-    Send feedback about the website to:
-  <a id="feedbackto" href="mailto:webmaster@paremus.com?subject=Feedback%C2%A0common/eclipse/UsingEclipsePlugin.html">webmaster@paremus.com</a>
-</div>
-</td><td nowrap class="footerLogos"></td>
-</tr>
-</table>
-</td></tr>
-</table>
-</body>
-</html>
\ No newline at end of file
diff --git a/sigil/eclipse/help/html/tasks/container_log.html b/sigil/eclipse/help/html/tasks/container_log.html
deleted file mode 100644
index 9b8808f..0000000
--- a/sigil/eclipse/help/html/tasks/container_log.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<html>
-<header>
-<title>Viewing The Newton Log</title>
-</header>
-<body bgcolor="#ffffff">
-<table width="100%">
-	<tr>
-		<td valign="bottom"><h1>Viewing The Newton Log</h1></td><td align="right"><img src="../images/sigil.gif" /></td>
-	</tr>
-	<tr><td colspan="2">
-<div id="footer">
-<table cellpadding="4" cellspacing="0" border="0">
-<tr>
-<td><a href="http://www.paremus.com/License">
-          Copyright &copy; 2003-2007 Paremus Limited.</a>
-      All rights reserved.
-            <br>
-
-<script type="text/javascript" language="JavaScript"><!--
-              document.write(" - "+"Last Published: " + document.lastModified);
-              //  --></script>
-<div id="feedback">
-    Send feedback about the website to:
-  <a id="feedbackto" href="mailto:webmaster@paremus.com?subject=Feedback%C2%A0common/eclipse/UsingEclipsePlugin.html">webmaster@paremus.com</a>
-</div>
-</td><td nowrap class="footerLogos"></td>
-</tr>
-</table>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/sigil/eclipse/help/html/tasks/debug_composite.html b/sigil/eclipse/help/html/tasks/debug_composite.html
deleted file mode 100644
index 43db6da..0000000
--- a/sigil/eclipse/help/html/tasks/debug_composite.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<html>
-<header>
-<title>Debugging A Composite</title>
-</header>
-<body bgcolor="#ffffff">
-<table width="100%">
-	<tr>
-		<td valign="bottom"><h1>Debugging A Composite</h1></td><td align="right"><img src="../images/sigil.gif" /></td>
-	</tr>
-	<tr><td colspan="2">
-<p>In order to debug composite applications using the Newton Eclipse
-      plugin, use the runtime configuration you created in above, and start it
-      using a debug session. This will launch a newton container as a separate
-      process to the Eclipse IDE environment but which can be controlled from
-      the IDE</p>
-
-      
-<div align="center">
-<img class="figure" alt="Debug" src="my-images/debug.png"></div>
-      
-<p>Install your composite into this container using the Newton context
-      menu in the package view as documented above. In this example we have
-      installed the gui.composite component from the fractal render demo into
-      a Newton debug container.</p>
-
-      
-<div align="center">
-<img class="figure" alt="Fractal GUI Debug" src="my-images/demo-gui.png"></div>      
-
-<p>You can now add break points within your code to allow you to get a
-      better idea of what is going on within your application. In this example
-      we have added a break point to the FractalViewFrame of the fractal
-      render demo to break out into an interactive debug session when any of
-      the buttons <em>draw</em>, <em>save</em>, <em>cancel</em> are pressed on
-      the gui window.</p>
-
-      
-<div align="center">
-<img class="figure" alt="Add a breakpoint" src="my-images/breakpoint.png"></div>
-      
-<p>You can then inspect variable values in top-right-hand corner as per
-      normal debugging in the Eclipse IDE.</p>
-      
-<div align="center">
-<img class="figure" alt="Debug breakpoint" src="my-images/debug-breakpoint.png"></div>
-<div id="footer">
-<table cellpadding="4" cellspacing="0" border="0">
-<tr>
-<td><a href="http://www.paremus.com/License">
-          Copyright &copy; 2003-2007 Paremus Limited.</a>
-      All rights reserved.
-            <br>
-
-<script type="text/javascript" language="JavaScript"><!--
-              document.write(" - "+"Last Published: " + document.lastModified);
-              //  --></script>
-<div id="feedback">
-    Send feedback about the website to:
-  <a id="feedbackto" href="mailto:webmaster@paremus.com?subject=Feedback%C2%A0common/eclipse/UsingEclipsePlugin.html">webmaster@paremus.com</a>
-</div>
-</td><td nowrap class="footerLogos"></td>
-</tr>
-</table>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/sigil/eclipse/help/html/tasks/install_composite.html b/sigil/eclipse/help/html/tasks/install_composite.html
deleted file mode 100644
index e20d472..0000000
--- a/sigil/eclipse/help/html/tasks/install_composite.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<html>
-<header>
-<title>Installing A Composite</title>
-</header>
-<body bgcolor="#ffffff">
-<table width="100%">
-	<tr>
-		<td valign="bottom"><h1>Installing A Composite</h1></td><td align="right"><img src="../images/sigil.gif" /></td>
-	</tr>
-	<tr><td colspan="2">
-<p>To install a composite into a Infiniflow Service Fabric container, you require a running
-      container instance on your machine. This can either be an external
-      process which you have launched using the bin/container script or the
-      container can be launched via an Eclipse runtime configuration as per
-      the instructions <a href="launch_newton.html" alt="Launching Newton">here</a>.</p> 
-      
-<p>You can then select your .composite file in the
-      package view and select Newton-&gt;Install Composite using the context
-      menu.</p>
-
-      
-<div id="footer">
-<table cellpadding="4" cellspacing="0" border="0">
-<tr>
-<td><a href="http://www.paremus.com/License">
-          Copyright &copy; 2003-2008 Paremus Limited.</a>
-      All rights reserved.
-            <br>
-
-<script type="text/javascript" language="JavaScript"><!--
-              document.write(" - "+"Last Published: " + document.lastModified);
-              //  --></script>
-<div id="feedback">
-    Send feedback about the website to:
-  <a id="feedbackto" href="mailto:webmaster@paremus.com?subject=Feedback%C2%A0common/eclipse/UsingEclipsePlugin.html">webmaster@paremus.com</a>
-</div>
-</td><td nowrap class="footerLogos"></td>
-</tr>
-</table>
-</body>
-</html>
\ No newline at end of file
diff --git a/sigil/eclipse/help/html/tasks/launch_newton.html b/sigil/eclipse/help/html/tasks/launch_newton.html
deleted file mode 100644
index 6a2edc4..0000000
--- a/sigil/eclipse/help/html/tasks/launch_newton.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<html>
-<header>
-<title>Launching Newton</title>
-</header>
-<table width="100%">
-	<tr>
-		<td valign="bottom"><h1>Launching Newton</h1></td><td align="right"><img src="../images/sigil.gif" /></td>
-	</tr>
-	<tr><td colspan="2">
-	<h2>Runtime Configuration</h2>
-	<p>To run a Infiniflow Service Fabric container within Eclipse you first need to configure
-      its runtime options in the IDE.</p>
-      
-	<p>Open the Run configuration dialog by selecting the Run &rarr; Run&hellip; option
-      from the menu bar.</p>
-
-	<div align="center"><img class="figure" alt="Run Menu" src="my-images/run-menu.png"></div>
-
-	<p>Create a new Newton configuration by right-clicking on the Newton
-      configuration group and selecting <em>New</em>. Type in a name for your
-      configuration, the other default options should be sufficient for most
-      users.</p>
-
-      
-	<div align="center"><img class="figure" alt="Run Dialog" src="my-images/run.png"></div>
-
-	<h2>Launch Newton</h2>      
-	<p>Click the <em>Run</em> button to start the container, you will see
-      the container output appear in the console tab. Wait until the <em>Boot
-      Complete</em> line appears, as below.</p>
-
-      
-	<div align="center"><img class="figure" alt="Boot Complete" src="my-images/run-complete.png"></div>
-        
-<div id="footer">
-<table cellpadding="4" cellspacing="0" border="0">
-<tr>
-<td><a href="http://www.paremus.com/License">
-          Copyright &copy; 2003-2007 Paremus Limited.</a>
-      All rights reserved.
-            <br>
-
-<script type="text/javascript" language="JavaScript"><!--
-              document.write(" - "+"Last Published: " + document.lastModified);
-              //  --></script>
-<div id="feedback">
-    Send feedback about the website to:
-  <a id="feedbackto" href="mailto:webmaster@paremus.com?subject=Feedback%C2%A0common/eclipse/UsingEclipsePlugin.html">webmaster@paremus.com</a>
-</div>
-</td><td nowrap class="footerLogos"></td>
-</tr>
-</table>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/sigil/eclipse/help/html/tasks/new_composite.html b/sigil/eclipse/help/html/tasks/new_composite.html
deleted file mode 100644
index 58d9541..0000000
--- a/sigil/eclipse/help/html/tasks/new_composite.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<html>
-<header>
-<title>Creating SCA Composites</title>
-</header>
-<body bgcolor="#ffffff">
-<table width="100%">
-	<tr>
-		<td valign="bottom"><h1>Creating SCA Composites</h1></td><td align="right"><img src="../images/sigil.gif" /></td>
-	</tr>
-	<tr><td colspan="2">
-	<p>
-	Create a new sca composite document using the <em>New->Other</em> menu option.<br/>
-	Page 1:<br/>
-	<img src="../images/new_composite_page1.png" alt="New Composite Page 1" /><br/>
-	Page 2:<br/>
-	<img src="../images/new_composite_page2.png" alt="New Composite Page 2" />
-	</p>
-	<p>There is basic support for context sensitive text completion in sca documents. Press <em>Ctrl+Space</em> to see a list of valid elements at the current cursor location.<br/>
-	<img src="../images/composite_suggest_text.png" alt="New Composite Page 2" />
-	</p>
-<div id="footer">
-<table cellpadding="4" cellspacing="0" border="0">
-<tr>
-<td><a href="http://www.paremus.com/License">
-          Copyright &copy; 2003-2007 Paremus Limited.</a>
-      All rights reserved.
-            <br>
-
-<script type="text/javascript" language="JavaScript"><!--
-              document.write(" - "+"Last Published: " + document.lastModified);
-              //  --></script>
-<div id="feedback">
-    Send feedback about the website to:
-  <a id="feedbackto" href="mailto:webmaster@paremus.com?subject=Feedback%C2%A0common/eclipse/UsingEclipsePlugin.html">webmaster@paremus.com</a>
-</div>
-</td><td nowrap class="footerLogos"></td>
-</tr>
-</table>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/sigil/eclipse/help/html/tasks/new_project.html b/sigil/eclipse/help/html/tasks/new_project.html
deleted file mode 100644
index 90e14e7..0000000
--- a/sigil/eclipse/help/html/tasks/new_project.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<html>
-<header>
-<title>Creating A Newton Project</title>
-</header>
-<body bgcolor="#ffffff">
-<table width="100%">
-	<tr>
-		<td valign="bottom"><h1>Creating A Newton Project</h1></td><td align="right"><img src="../images/sigil.gif" /></td>
-	</tr>
-	<tr><td colspan="2">
-<div id="footer">
-<table cellpadding="4" cellspacing="0" border="0">
-<tr>
-<td><a href="http://www.paremus.com/License">
-          Copyright &copy; 2003-2007 Paremus Limited.</a>
-      All rights reserved.
-            <br>
-
-<script type="text/javascript" language="JavaScript"><!--
-              document.write(" - "+"Last Published: " + document.lastModified);
-              //  --></script>
-<div id="feedback">
-    Send feedback about the website to:
-  <a id="feedbackto" href="mailto:webmaster@paremus.com?subject=Feedback%C2%A0common/eclipse/UsingEclipsePlugin.html">webmaster@paremus.com</a>
-</div>
-</td><td nowrap class="footerLogos"></td>
-</tr>
-</table>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/sigil/eclipse/help/html/tasks/new_system.html b/sigil/eclipse/help/html/tasks/new_system.html
deleted file mode 100644
index a0cc7ae..0000000
--- a/sigil/eclipse/help/html/tasks/new_system.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<html>
-<header>
-<title>Creating Newton Systems</title>
-</header>
-<body bgcolor="#ffffff">
-<table width="100%">
-	<tr>
-		<td valign="bottom"><h1>Creating Newton Systems</h1></td><td align="right"><img src="../images/sigil.gif" /></td>
-	</tr>
-	<tr><td colspan="2">
-<div id="footer">
-<table cellpadding="4" cellspacing="0" border="0">
-<tr>
-<td><a href="http://www.paremus.com/License">
-          Copyright &copy; 2003-2007 Paremus Limited.</a>
-      All rights reserved.
-            <br>
-
-<script type="text/javascript" language="JavaScript"><!--
-              document.write(" - "+"Last Published: " + document.lastModified);
-              //  --></script>
-<div id="feedback">
-    Send feedback about the website to:
-  <a id="feedbackto" href="mailto:webmaster@paremus.com?subject=Feedback%C2%A0common/eclipse/UsingEclipsePlugin.html">webmaster@paremus.com</a>
-</div>
-</td><td nowrap class="footerLogos"></td>
-</tr>
-</table>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/sigil/eclipse/help/html/tasks/sigil_config.html b/sigil/eclipse/help/html/tasks/sigil_config.html
deleted file mode 100644
index 8334f70..0000000
--- a/sigil/eclipse/help/html/tasks/sigil_config.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<html>
-<header>
-<title>Configuring Sigil</title>
-</header>
-<body bgcolor="#ffffff">
-<table width="100%">
-	<tr>
-		<td valign="bottom"><h1>Configuring Sigil</h1></td><td align="right"><img src="../images/sigil.gif" /></td>
-	</tr>
-	<tr><td colspan="2">
-<p>After having installed sigil, the preferences dialog should appear and ask you to specify the location of a valid newton install directory.</p>
-<div id="footer">
-<table cellpadding="4" cellspacing="0" border="0">
-<tr>
-<td><a href="http://www.paremus.com/License">
-          Copyright &copy; 2003-2007 Paremus Limited.</a>
-      All rights reserved.
-            <br>
-
-<script type="text/javascript" language="JavaScript"><!--
-              document.write(" - "+"Last Published: " + document.lastModified);
-              //  --></script>
-<div id="feedback">
-    Send feedback about the website to:
-  <a id="feedbackto" href="mailto:webmaster@paremus.com?subject=Feedback%C2%A0common/eclipse/UsingEclipsePlugin.html">webmaster@paremus.com</a>
-</div>
-</td><td nowrap class="footerLogos"></td>
-</tr>
-</table>
-</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/sigil/eclipse/help/ivy.xml b/sigil/eclipse/help/ivy.xml
deleted file mode 100644
index de4c472..0000000
--- a/sigil/eclipse/help/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.eclipse.help"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.eclipse.help" />
-   </publications>
-</ivy-module>
diff --git a/sigil/eclipse/help/plugin.xml b/sigil/eclipse/help/plugin.xml
deleted file mode 100644
index b2cc3ec..0000000
--- a/sigil/eclipse/help/plugin.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.ui.cheatsheets.cheatSheetContent">
-      <category
-            id="org.apache.felix.sigil.help.category"
-            name="Sigil">
-      </category>
-      <cheatsheet
-            category="org.apache.felix.sigil.help.category"
-            composite="false"
-            contentFile="cheatsheets/HelloWorld.xml"
-            id="org.apache.felix.sigil.help.createProjectCheatSheet"
-            name="Create a Hello World composite application">
-      </cheatsheet>
-   </extension>
-</plugin>
diff --git a/sigil/eclipse/help/sigil.properties b/sigil/eclipse/help/sigil.properties
deleted file mode 100644
index e528ef8..0000000
--- a/sigil/eclipse/help/sigil.properties
+++ /dev/null
@@ -1,66 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--activator: org.apache.felix.sigil.eclipse.help.Activator
-
--singleton: true
-
--bundles: \
-	org.apache.felix.sigil.eclipse.help, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-	cheatsheets, \
-	cheatsheets/HelloWorld.xml, \
-	html, \
-	html/book.html, \
-	html/concepts, \
-	html/images, \
-	html/refs, \
-	html/tasks, \
-	html/tasks/container_log.html, \
-	html/tasks/debug_composite.html, \
-	html/tasks/install_composite.html, \
-	html/tasks/launch_newton.html, \
-	html/tasks/new_composite.html, \
-	html/tasks/new_project.html, \
-	html/tasks/new_system.html, \
-	html/tasks/sigil_config.html, \
-	plugin.xml, \
-	toc.xml, \
-
--sourcedirs: \
-	src, \
-
--imports: \
-	org.apache.felix.sigil.eclipse, \
-	org.apache.felix.sigil.eclipse.model.project, \
-	org.apache.felix.sigil.eclipse.ui.actions, \
-	org.apache.felix.sigil.eclipse.ui.wizard.project, \
-	org.eclipse.core.resources, \
-	org.eclipse.core.runtime.jobs, \
-	org.eclipse.jface.action, \
-	org.eclipse.jface.dialogs, \
-	org.eclipse.jface.viewers, \
-	org.eclipse.jface.window, \
-	org.eclipse.jface.wizard, \
-	org.eclipse.ui, \
-	org.eclipse.ui.actions, \
-	org.eclipse.ui.cheatsheets, \
-	org.eclipse.ui.part, \
-	org.eclipse.ui.plugin, \
-	org.osgi.framework, \
-
--requires: \
-	org.eclipse.core.commands;version=3.4.0, \
-	org.eclipse.core.runtime;version=3.4.0, \
-	org.eclipse.equinox.common;version=3.4.0, \
-	org.eclipse.equinox.registry;version=3.4.0, \
-	org.eclipse.swt;version=3.4.2, \
-	org.eclipse.ui.ide;version=3.4.2, \
-	org.eclipse.ui.workbench;version=3.4.1, \
-
-header;Bundle-ActivationPolicy: lazy	
-
-# end
diff --git a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/AbstractNewWizardAction.java b/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/AbstractNewWizardAction.java
deleted file mode 100644
index 56609de..0000000
--- a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/AbstractNewWizardAction.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.cheatsheets.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-public abstract class AbstractNewWizardAction extends Action
-{
-
-    @Override
-    public void run()
-    {
-        Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-
-        try
-        {
-            INewWizard wizard = createWizard();
-            wizard.init(PlatformUI.getWorkbench(), getSelection());
-            WizardDialog dialog = new WizardDialog(shell, wizard);
-            int res = dialog.open();
-            notifyResult(res == Window.OK);
-        }
-        catch (CoreException e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    protected abstract INewWizard createWizard() throws CoreException;
-
-    private IStructuredSelection getSelection()
-    {
-        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (window != null)
-        {
-            ISelection selection = window.getSelectionService().getSelection();
-            if (selection instanceof IStructuredSelection)
-            {
-                return (IStructuredSelection) selection;
-            }
-        }
-        return StructuredSelection.EMPTY;
-    }
-}
\ No newline at end of file
diff --git a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/CopyResourceFromPlugin.java b/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/CopyResourceFromPlugin.java
deleted file mode 100644
index 14491de..0000000
--- a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/CopyResourceFromPlugin.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.cheatsheets.actions;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.cheatsheets.ICheatSheetAction;
-import org.eclipse.ui.cheatsheets.ICheatSheetManager;
-import org.eclipse.ui.part.FileEditorInput;
-import org.osgi.framework.Bundle;
-
-public class CopyResourceFromPlugin extends Action implements ICheatSheetAction
-{
-
-    private String targetProject;
-    private String targetFolder;
-    private String sourceBundle;
-    private String sourcePath;
-    private String editorID;
-
-    public void run(String[] params, ICheatSheetManager manager)
-    {
-        if (params != null && params.length > 4)
-        {
-            targetProject = params[0];
-            targetFolder = params[1];
-            sourceBundle = params[2];
-            sourcePath = params[3];
-            editorID = params[4];
-        }
-
-        WorkspaceModifyOperation op = new WorkspaceModifyOperation()
-        {
-            @Override
-            protected void execute(IProgressMonitor monitor) throws CoreException
-            {
-                try
-                {
-                    Bundle b = Platform.getBundle(sourceBundle);
-
-                    IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-                    IProject project = workspaceRoot.getProject(targetProject);
-                    IPath path = new Path(targetFolder).append(sourcePath.substring(sourcePath.lastIndexOf('/')));
-                    IFile file = project.getFile(path);
-
-                    if (!file.exists())
-                    {
-                        mkdirs((IFolder) file.getParent(), monitor);
-
-                        InputStream in = FileLocator.openStream(b, new Path(sourcePath),
-                            false);
-                        file.create(in, true, monitor);
-                    }
-
-                    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-                    FileEditorInput input = new FileEditorInput(file);
-                    window.getActivePage().openEditor(input, editorID);
-                }
-                catch (IOException e)
-                {
-                    // TODO Auto-generated catch block
-                    e.printStackTrace();
-                }
-            }
-        };
-
-        try
-        {
-            new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(false,
-                false, op);
-        }
-        catch (InvocationTargetException e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-        catch (InterruptedException e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    private void mkdirs(IFolder folder, IProgressMonitor monitor) throws CoreException
-    {
-        IContainer parent = folder.getParent();
-        if (!parent.exists())
-        {
-            mkdirs((IFolder) parent, monitor);
-        }
-
-        if (!folder.exists())
-        {
-            folder.create(true, true, monitor);
-        }
-
-    }
-}
diff --git a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/OpenEmptySigilProjectWizardAction.java b/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/OpenEmptySigilProjectWizardAction.java
deleted file mode 100644
index ef869b3..0000000
--- a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/OpenEmptySigilProjectWizardAction.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.cheatsheets.actions;
-
-import org.apache.felix.sigil.eclipse.ui.wizard.project.SigilProjectWizard;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.cheatsheets.ICheatSheetAction;
-import org.eclipse.ui.cheatsheets.ICheatSheetManager;
-
-public class OpenEmptySigilProjectWizardAction extends AbstractNewWizardAction implements ICheatSheetAction
-{
-
-    private String name;
-
-    public void run(String[] params, ICheatSheetManager manager)
-    {
-        if (params != null && params.length > 0)
-        {
-            name = params[0];
-        }
-
-        run();
-    }
-
-    @Override
-    protected INewWizard createWizard() throws CoreException
-    {
-        SigilProjectWizard wizard = new SigilProjectWizard();
-        wizard.setName(name);
-        return wizard;
-    }
-}
diff --git a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/ResolveProjectDependencies.java b/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/ResolveProjectDependencies.java
deleted file mode 100644
index cebdfc4..0000000
--- a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/ResolveProjectDependencies.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.cheatsheets.actions;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.actions.ResolveProjectDependenciesAction;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.cheatsheets.ICheatSheetAction;
-import org.eclipse.ui.cheatsheets.ICheatSheetManager;
-
-public class ResolveProjectDependencies extends Action implements ICheatSheetAction
-{
-
-    private String targetProject;
-
-    public void run(String[] params, ICheatSheetManager manager)
-    {
-        if (params != null && params.length > 3)
-        {
-            targetProject = params[0];
-        }
-
-        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-        IProject project = workspaceRoot.getProject(targetProject);
-
-        try
-        {
-            ISigilProjectModel sigil = SigilCore.create(project);
-            new ResolveProjectDependenciesAction(sigil, false).run();
-        }
-        catch (CoreException e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-}
diff --git a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/ShowViewAction.java b/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/ShowViewAction.java
deleted file mode 100644
index 9e9af4a..0000000
--- a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/cheatsheets/actions/ShowViewAction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.cheatsheets.actions;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.cheatsheets.ICheatSheetAction;
-import org.eclipse.ui.cheatsheets.ICheatSheetManager;
-
-public class ShowViewAction extends Action implements ICheatSheetAction
-{
-
-    public void run(String[] params, ICheatSheetManager manager)
-    {
-        if (params != null && params.length > 0)
-        {
-            IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-            IWorkbenchPage page = window.getActivePage();
-            try
-            {
-                page.showView(params[0]);
-            }
-            catch (PartInitException e)
-            {
-                SigilCore.error("Failed to show view", e);
-            }
-        }
-
-    }
-}
diff --git a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/help/Activator.java b/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/help/Activator.java
deleted file mode 100644
index 99429cc..0000000
--- a/sigil/eclipse/help/src/org/apache/felix/sigil/eclipse/help/Activator.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.help;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends AbstractUIPlugin
-{
-
-    // The plug-in ID
-    public static final String PLUGIN_ID = "org.apache.felix.sigil.eclipse.help";
-
-    // The shared instance
-    private static Activator plugin;
-
-    /**
-     * The constructor
-     */
-    public Activator()
-    {
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     */
-    public void start(BundleContext context) throws Exception
-    {
-        super.start(context);
-        plugin = this;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     */
-    public void stop(BundleContext context) throws Exception
-    {
-        plugin = null;
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static Activator getDefault()
-    {
-        return plugin;
-    }
-
-}
diff --git a/sigil/eclipse/help/toc.xml b/sigil/eclipse/help/toc.xml
deleted file mode 100644
index 191daf4..0000000
--- a/sigil/eclipse/help/toc.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<toc label="Sigil - Newton Development Plugin" topic="html/book.html">
-	<topic label="Configuring Sigil" href="html/tasks/sigil_config.html"/>
-	<topic label="Creating A Newton Project" href="html/tasks/new_project.html"/> 
-	<topic label="Creating SCA Composites" href="html/tasks/new_composite.html"/>
-	<topic label="Creating Newton Systems" href="html/tasks/new_system.html"/>
-	<topic label="Launching Newton" href="html/tasks/launch_newton.html"/>
-	<topic label="Viewing The Newton Log" href="html/tasks/container_log.html"/>
-	<topic label="Installing Your Composites" href="html/tasks/install_composite.html"/>	
-	<topic label="Debugging Your Composites" href="html/tasks/debug_composite.html"/>	
-</toc>
diff --git a/sigil/eclipse/obr.feature/.classpath b/sigil/eclipse/obr.feature/.classpath
deleted file mode 100644
index dd6ef05..0000000
--- a/sigil/eclipse/obr.feature/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/eclipse/obr.feature/.project b/sigil/eclipse/obr.feature/.project
deleted file mode 100644
index 536e3a1..0000000
--- a/sigil/eclipse/obr.feature/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.eclipse.obr.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-        <buildSpec>
-                <buildCommand>
-                        <name>org.eclipse.jdt.core.javabuilder</name>
-                        <arguments>
-                        </arguments>
-                </buildCommand>
-                <buildCommand>
-                        <name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-                        <arguments>
-                        </arguments>
-                </buildCommand>
-        </buildSpec>
-        <natures>
-                <nature>org.apache.felix.sigil.sigilnature</nature>
-                <nature>org.eclipse.jdt.core.javanature</nature>
-        </natures>
-</projectDescription>
diff --git a/sigil/eclipse/obr.feature/build.properties b/sigil/eclipse/obr.feature/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/sigil/eclipse/obr.feature/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/sigil/eclipse/obr.feature/build.xml b/sigil/eclipse/obr.feature/build.xml
deleted file mode 100644
index bec9912..0000000
--- a/sigil/eclipse/obr.feature/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="eclipse.obr.feature" default="build">
-  <import file="../build.xml"/>
-</project>
diff --git a/sigil/eclipse/obr.feature/feature.xml b/sigil/eclipse/obr.feature/feature.xml
deleted file mode 100644
index b607bf1..0000000
--- a/sigil/eclipse/obr.feature/feature.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<feature
-      id="org.apache.felix.sigil.eclipse.obr.feature"
-      label="Sigil OBR"
-      version="${version}"
-      provider-name="Apache Software Foundation">
-
-   <description>
-      Sigil OBR plugin, allows Sigil to use OSGi Bundle Repositories to download OSGi bundles into the Eclipse workspace.
-   </description>
-
-   <license url="http://www.apache.org/licenses/LICENSE-2.0">
-      Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-or implied.
-See the License for the specific language governing permissions
-and
-limitations under the License.
-   </license>
-
-   <!--url>
-      <update url="${update-site}"/>
-   </url-->
-
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.apache.felix.sigil.eclipse.core" version="${version}" match="greaterOrEqual"/>
-      <import plugin="org.apache.felix.sigil.eclipse.ui" version="${version}" match="greaterOrEqual"/>
-      <import plugin="org.apache.felix.sigil.common.core" version="${version}" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.osgi"/>
-      <import plugin="org.eclipse.equinox.common" version="3.4.0" match="greaterOrEqual"/>
-   </requires>
-
-   <plugin
-         id="org.apache.felix.sigil.common.obr"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.felix.sigil.eclipse.obr"
-         download-size="0"
-         install-size="0"
-         version="${version}"
-         unpack="false"/>
-
-</feature>
diff --git a/sigil/eclipse/obr.feature/ivy.xml b/sigil/eclipse/obr.feature/ivy.xml
deleted file mode 100644
index 565d1a9..0000000
--- a/sigil/eclipse/obr.feature/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.eclipse.obr.feature"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.eclipse.obr.feature" />
-   </publications>
-</ivy-module>
diff --git a/sigil/eclipse/obr.feature/sigil.properties b/sigil/eclipse/obr.feature/sigil.properties
deleted file mode 100644
index 5ebdd18..0000000
--- a/sigil/eclipse/obr.feature/sigil.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--bundles: \
-	org.apache.felix.sigil.eclipse.obr.feature, \
-
--resources: \
-	{feature.xml}, \
-
-# end
diff --git a/sigil/eclipse/obr/.classpath b/sigil/eclipse/obr/.classpath
deleted file mode 100644
index aee728a..0000000
--- a/sigil/eclipse/obr/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="lib" path="lib/org.eclipse.swt.carbon.macosx.jar"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/eclipse/obr/.project b/sigil/eclipse/obr/.project
deleted file mode 100644
index f534dee..0000000
--- a/sigil/eclipse/obr/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.eclipse.obr</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/eclipse/obr/.settings/org.eclipse.jdt.core.prefs b/sigil/eclipse/obr/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 412f292..0000000
--- a/sigil/eclipse/obr/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,263 +0,0 @@
-#Thu Sep 17 16:10:07 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/eclipse/obr/.settings/org.eclipse.jdt.ui.prefs b/sigil/eclipse/obr/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 0158086..0000000
--- a/sigil/eclipse/obr/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:10:07 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/eclipse/obr/DEPENDENCIES b/sigil/eclipse/obr/DEPENDENCIES
deleted file mode 100644
index ccf383e..0000000
--- a/sigil/eclipse/obr/DEPENDENCIES
+++ /dev/null
@@ -1,26 +0,0 @@
-Apache Felix Sigil Eclipse OBR
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed by the The Eclipse Foundation
-(http://www.eclipse.org)
-Copyright © 2010 The Eclipse Foundation. All Rights Reserved.
-Licensed under the Eclipse Public License - v 1.0.
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
-- Eclipse Public License - v 1.0
diff --git a/sigil/eclipse/obr/NOTICE b/sigil/eclipse/obr/NOTICE
deleted file mode 100644
index 20c985b..0000000
--- a/sigil/eclipse/obr/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Eclipse OBR
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/eclipse/obr/build.xml b/sigil/eclipse/obr/build.xml
deleted file mode 100644
index 9d56d59..0000000
--- a/sigil/eclipse/obr/build.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="eclipse.obr" default="build"
-	  xmlns:ivy="antlib:org.apache.ivy.ant">
-  <import file="../build.xml"/>
-  <target name="init">
-    <ivy:retrieve organisation="org.eclipse" module="org.eclipse.swt.carbon.macosx" revision="3.4.1.v3452b" inline="true" pattern="lib/[artifact].[ext]" transitive="false"/>
-  </target>
-</project>
diff --git a/sigil/eclipse/obr/ivy.xml b/sigil/eclipse/obr/ivy.xml
deleted file mode 100644
index dd47d0c..0000000
--- a/sigil/eclipse/obr/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.eclipse.obr"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.eclipse.obr" />
-   </publications>
-</ivy-module>
diff --git a/sigil/eclipse/obr/plugin.xml b/sigil/eclipse/obr/plugin.xml
deleted file mode 100644
index 206ad09..0000000
--- a/sigil/eclipse/obr/plugin.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.apache.felix.sigil.repositoryprovider">
-      <provider
-            class="org.apache.felix.sigil.obr.eclipse.EclipseOBRRepositoryProvider"
-            dynamic="true"
-            id="org.apache.felix.sigil.obr.provider"
-            alias="obr"
-            type="OSGi Bundle Repository (OBR)">
-      </provider>
-   </extension>
-   <extension
-         point="org.apache.felix.sigil.ui.repositorywizard">
-      <wizard
-            class="org.apache.felix.sigil.obr.eclipse.OBRRepositoryWizard"
-            repository="org.apache.felix.sigil.obr.provider">
-      </wizard>
-   </extension>
-
-</plugin>
diff --git a/sigil/eclipse/obr/sigil.properties b/sigil/eclipse/obr/sigil.properties
deleted file mode 100644
index e1923a5..0000000
--- a/sigil/eclipse/obr/sigil.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--activator: org.apache.felix.sigil.obr.eclipse.Activator
-
--singleton: true
-
--bundles: \
-	org.apache.felix.sigil.eclipse.obr, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-	plugin.xml, \
-
--sourcedirs: \
-	src, \
-
--imports: \
-	org.apache.felix.sigil.common.obr, \
-	org.apache.felix.sigil.common.repository, \
-	org.apache.felix.sigil.eclipse.model.repository, \
-	org.apache.felix.sigil.eclipse.ui.wizard.repository, \
-	org.eclipse.jface.preference, \
-	org.eclipse.jface.wizard, \
-	org.eclipse.ui.plugin, \
-	org.osgi.framework, \
-
--requires: \
-	org.eclipse.core.runtime;version=3.4.0, \
-	org.eclipse.equinox.common;version=3.4.0, \
-	org.eclipse.swt;version=3.4.2, \
-
-header;Bundle-ActivationPolicy: lazy	
-
-option;addMissingImports: false
-
-# end
diff --git a/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/Activator.java b/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/Activator.java
deleted file mode 100644
index 051484d..0000000
--- a/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/Activator.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.obr.eclipse;
-
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends AbstractUIPlugin
-{
-
-    // The plug-in ID
-    public static final String PLUGIN_ID = "org.apache.felix.sigil.eclipse.obr";
-
-    // The shared instance
-    private static Activator plugin;
-
-
-    /**
-     * The constructor
-     */
-    public Activator()
-    {
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     */
-    public void start( BundleContext context ) throws Exception
-    {
-        super.start( context );
-        plugin = this;
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     */
-    public void stop( BundleContext context ) throws Exception
-    {
-        plugin = null;
-        super.stop( context );
-    }
-
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static Activator getDefault()
-    {
-        return plugin;
-    }
-
-}
diff --git a/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/EclipseOBRRepositoryProvider.java b/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/EclipseOBRRepositoryProvider.java
deleted file mode 100644
index d372184..0000000
--- a/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/EclipseOBRRepositoryProvider.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.obr.eclipse;
-
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.obr.OBRRepositoryProvider;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.RepositoryException;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * @author dave
- *
- */
-public class EclipseOBRRepositoryProvider extends OBRRepositoryProvider
-{
-
-    @Override
-    public IBundleRepository createRepository(String id, Properties preferences)
-        throws RepositoryException
-    {
-        Properties props = new Properties(preferences);
-        
-        if ( !preferences.containsKey(INDEX_CACHE_FILE) ) {
-            String index = newStatePath(id, "index.obr");
-            props.put(INDEX_CACHE_FILE, index);
-        }
-        
-        if ( !preferences.containsKey(CACHE_DIRECTORY) ) {
-            String dir = newStatePath(id, "dir");
-            props.put(CACHE_DIRECTORY, dir);
-        }
-        
-        return super.createRepository(id, props);
-    }
-
-    /**
-     * @param id
-     * @param string
-     * @return
-     */
-    private String newStatePath(String id, String string)
-    {
-        IPath state = Activator.getDefault().getStateLocation();
-        state.append("cache").append(id).append(string);
-        return state.toOSString();
-    }
-
-}
diff --git a/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/OBRRepositoryWizard.java b/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/OBRRepositoryWizard.java
deleted file mode 100644
index ae5c245..0000000
--- a/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/OBRRepositoryWizard.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.obr.eclipse;
-
-
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizard;
-
-
-public class OBRRepositoryWizard extends RepositoryWizard
-{
-
-    @Override
-    public void addPages()
-    {
-        addPage( new OBRRepositoryWizardPage( this ) );
-    }
-}
diff --git a/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/OBRRepositoryWizardPage.java b/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/OBRRepositoryWizardPage.java
deleted file mode 100644
index cd1856a..0000000
--- a/sigil/eclipse/obr/src/org/apache/felix/sigil/obr/eclipse/OBRRepositoryWizardPage.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.obr.eclipse;
-
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizard;
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizardPage;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.DirectoryFieldEditor;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-
-
-public class OBRRepositoryWizardPage extends RepositoryWizardPage implements IWizardPage
-{
-
-    private StringFieldEditor urlEditor;
-    private StringFieldEditor cacheEditor;
-
-
-    protected OBRRepositoryWizardPage( RepositoryWizard parent )
-    {
-        super( "OSGi Bundle Repository", parent );
-    }
-
-
-    @Override
-    public void createFieldEditors()
-    {
-        createField( urlEditor = new StringFieldEditor( "url", "URL:", getFieldEditorParent() ) );
-        createField( cacheEditor = new DirectoryFieldEditor( "cache", "Cache:", getFieldEditorParent() ) );
-        addField( new BooleanFieldEditor( "inmemory", "In Memory:", getFieldEditorParent() ) );
-    }
-
-
-    private void createField( StringFieldEditor editor )
-    {
-        editor.getTextControl( getFieldEditorParent() ).addModifyListener( new ModifyListener()
-        {
-            public void modifyText( ModifyEvent e )
-            {
-                checkPageComplete();
-            }
-        } );
-        addField( editor );
-    }
-
-
-    @Override
-    protected void checkPageComplete()
-    {
-        super.checkPageComplete();
-        if ( isPageComplete() && checkURLComplete() )
-        {
-            checkCacheComplete();
-        }
-    }
-
-
-    private boolean checkCacheComplete()
-    {
-        setPageComplete( cacheEditor.getStringValue().length() > 0 );
-
-        if ( isPageComplete() )
-        {
-            if ( new File( cacheEditor.getStringValue() ).isDirectory() )
-            {
-                setErrorMessage( null );
-            }
-            else
-            {
-                setErrorMessage( "Invalid cache directory" );
-                setPageComplete( false );
-            }
-        }
-
-        return isPageComplete();
-    }
-
-
-    private boolean checkURLComplete()
-    {
-        setPageComplete( urlEditor.getStringValue().length() > 0 );
-
-        if ( isPageComplete() )
-        {
-            try
-            {
-                new URL( urlEditor.getStringValue() );
-                setErrorMessage( null );
-            }
-            catch ( MalformedURLException e )
-            {
-                if ( !new File( urlEditor.getStringValue() ).isFile() )
-                {
-                    setErrorMessage( "Invalid repository url: " + e.getMessage() );
-                    setPageComplete( false );
-                }
-            }
-        }
-
-        return isPageComplete();
-    }
-
-
-    @Override
-    public void storeFields()
-    {
-        super.storeFields();
-        IPath dir = Activator.getDefault().getStateLocation();
-        getModel().getProperties().setProperty( "index", dir.append( getModel().getId() + ".obr" ).toOSString() );
-    }
-
-}
diff --git a/sigil/eclipse/runtime/.classpath b/sigil/eclipse/runtime/.classpath
deleted file mode 100644
index fce9fdb..0000000
--- a/sigil/eclipse/runtime/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="lib" path="lib/org.eclipse.swt.carbon.macosx.jar"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/eclipse/runtime/.project b/sigil/eclipse/runtime/.project
deleted file mode 100644
index 7145f7e..0000000
--- a/sigil/eclipse/runtime/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.eclipse.runtime</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/eclipse/runtime/.settings/org.eclipse.jdt.core.prefs b/sigil/eclipse/runtime/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9d341cf..0000000
--- a/sigil/eclipse/runtime/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,258 +0,0 @@
-#Thu Sep 17 16:10:24 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/eclipse/runtime/.settings/org.eclipse.jdt.ui.prefs b/sigil/eclipse/runtime/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 128334d..0000000
--- a/sigil/eclipse/runtime/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:10:24 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/eclipse/runtime/DEPENDENCIES b/sigil/eclipse/runtime/DEPENDENCIES
deleted file mode 100644
index 0159f80..0000000
--- a/sigil/eclipse/runtime/DEPENDENCIES
+++ /dev/null
@@ -1,26 +0,0 @@
-Apache Felix Sigil Eclipse Runtime
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed by the The Eclipse Foundation
-(http://www.eclipse.org)
-Copyright © 2010 The Eclipse Foundation. All Rights Reserved.
-Licensed under the Eclipse Public License - v 1.0.
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
-- Eclipse Public License - v 1.0
diff --git a/sigil/eclipse/runtime/NOTICE b/sigil/eclipse/runtime/NOTICE
deleted file mode 100644
index b6758b9..0000000
--- a/sigil/eclipse/runtime/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Eclipse Runtime
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/eclipse/runtime/build.xml b/sigil/eclipse/runtime/build.xml
deleted file mode 100644
index c5435a0..0000000
--- a/sigil/eclipse/runtime/build.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="eclipse.runtime" default="build"
-	  xmlns:ivy="antlib:org.apache.ivy.ant">
-  <import file="../build.xml"/>
-  <target name="init">
-    <ivy:retrieve organisation="org.eclipse" module="org.eclipse.swt.carbon.macosx" revision="3.4.1.v3452b" inline="true" pattern="lib/[artifact].[ext]" transitive="false"/>
-  </target>
-</project>
diff --git a/sigil/eclipse/runtime/icons/logo16x16.gif b/sigil/eclipse/runtime/icons/logo16x16.gif
deleted file mode 100644
index 0c344d8..0000000
--- a/sigil/eclipse/runtime/icons/logo16x16.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/runtime/ivy.xml b/sigil/eclipse/runtime/ivy.xml
deleted file mode 100644
index a428817..0000000
--- a/sigil/eclipse/runtime/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.eclipse.runtime"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.eclipse.runtime" />
-   </publications>
-</ivy-module>
diff --git a/sigil/eclipse/runtime/plugin.xml b/sigil/eclipse/runtime/plugin.xml
deleted file mode 100644
index c1b4a27..0000000
--- a/sigil/eclipse/runtime/plugin.xml
+++ /dev/null
@@ -1,534 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<?eclipse version="3.2"?>
-<plugin>
-   <extension point = "org.eclipse.debug.core.launchConfigurationTypes">
-	   <launchConfigurationType
-	   	   id="org.apache.felix.sigil.eclipse.runtime.OSGi"
-		   name="OSGi Application"
-		   delegate="org.apache.felix.sigil.eclipse.runtime.OSGiLauncher"
-		   modes= "run, debug"
-		   sourceLocatorId="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"
-	       sourcePathComputerId="org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer">
-		</launchConfigurationType>
-	</extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTabGroups">
-      <launchConfigurationTabGroup
-            class="org.apache.felix.sigil.eclipse.runtime.config.OSGiLaunchConfigurationTabGroup"
-            id="org.apache.felix.sigil.eclipse.runtime.config.OSGiLaunchConfigurationTabGroup"
-            type="org.apache.felix.sigil.eclipse.runtime.OSGi"/>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchShortcuts">
-      <shortcut
-            class="org.apache.felix.sigil.eclipse.runtime.shortcut.OSGiLaunchShortCut"
-            icon="/icons/logo16x16.gif"
-            id="org.apache.felix.sigil.eclipse.runtime.shortcut"
-            label="OSGi Application"
-            modes="run,debug">
-         <contextualLaunch>
-            <enablement>
-               <with variable="selection">
-                  <count value="1"/>
-                  <iterate>
-                     <or>
-	                     <instanceof value="org.eclipse.jdt.core.IJavaProject"/>
-                         <test
-                               property="org.apache.felix.sigil.isSigilProject"
-                               value="true"/>
-	                 </or>
-                  </iterate>
-               </with>
-            </enablement>
-         </contextualLaunch>
-      </shortcut>
-   </extension>
-   <extension
-         point="org.eclipse.jdt.launching.classpathProviders">
-      <classpathProvider
-            class="org.apache.felix.sigil.eclipse.runtime.source.SigilSourcePathProvider"
-            id="org.apache.felix.sigil.classpath.Provider"/>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTypeImages">
-      <launchConfigurationTypeImage
-            configTypeID="org.apache.felix.sigil.eclipse.runtime.OSGi"
-            icon="icons/logo16x16.gif"
-            id="org.apache.felix.sigil.eclipse.runtime.OSGi">
-      </launchConfigurationTypeImage>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            id="org.apache.felix.sigil.runtime.commands.installProject"
-            name="%commandInstallProject">
-      </command>
-      <command
-            id="org.apache.felix.sigil.runtime.commands.uninstallProject"
-            name="%commandUninstallProject">
-      </command>
-      <command
-            id="org.apache.felix.sigil.runtime.commands.reinstallProject"
-            name="%commandReinstallProject">
-      </command>
-      <command
-            id="org.apache.felix.sigil.runtime.commands.startProject"
-            name="%commandStartProject">
-      </command>
-      <command
-            id="org.apache.felix.sigil.runtime.commands.stopProject"
-            name="%commandStopProject">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commandImages">
-      <image
-            commandId="org.apache.felix.sigil.runtime.commands.installProject"
-            icon="etc/images/installBundle.png">
-      </image>
-      <image
-            commandId="org.apache.felix.sigil.runtime.commands.uninstallProject"
-            icon="etc/images/uninstallBundle.png">
-      </image>
-      <image
-            commandId="org.apache.felix.sigil.runtime.commands.reinstallProject"
-            icon="etc/images/refreshBundle.png">
-      </image>
-      <image
-            commandId="org.apache.felix.sigil.runtime.commands.startProject"
-            icon="etc/images/startBundle.png">
-      </image>
-      <image
-            commandId="org.apache.felix.sigil.runtime.commands.stopProject"
-            icon="etc/images/stopBundle.png">
-      </image>
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            class="org.cauldron.sigil.runtime.handlers.project.SelectionProjectHandler:install"
-            commandId="org.apache.felix.sigil.runtime.commands.installProject">
-         <activeWhen>
-            <with
-                  variable="selection">
-               <iterate
-                     ifEmpty="false"
-                     operator="or">
-                  <and>
-                     <or>
-	                     <instanceof
-	                           value="org.eclipse.core.resources.IFile">
-	                     </instanceof>
-	                     <instanceof
-	                           value="org.eclipse.core.resources.IProject">
-	                     </instanceof>
-	                 </or>
-                     <test
-                           property="org.cauldron.sigil.isSigilProject"
-                           value="true">
-                     </test>
-                  </and>
-               </iterate>
-            </with>
-         </activeWhen>
-      </handler>      
-      <handler
-            class="org.cauldron.sigil.runtime.handlers.project.SelectionProjectHandler:start"
-            commandId="org.apache.felix.sigil.runtime.commands.startProject">
-         <activeWhen>
-            <with
-                  variable="selection">
-               <iterate
-                     ifEmpty="false"
-                     operator="or">
-                  <and>
-                     <or>
-	                     <instanceof
-	                           value="org.eclipse.core.resources.IFile">
-	                     </instanceof>
-	                     <instanceof
-	                           value="org.eclipse.core.resources.IProject">
-	                     </instanceof>
-	                 </or>
-                     <test
-                           property="org.cauldron.sigil.isSigilProject"
-                           value="true">
-                     </test>
-                  </and>
-               </iterate>
-            </with>
-         </activeWhen>
-      </handler>  
-                <handler
-            class="org.cauldron.sigil.runtime.handlers.project.SelectionProjectHandler:stop"
-            commandId="org.apache.felix.sigil.runtime.commands.stopProject">
-         <activeWhen>
-            <with
-                  variable="selection">
-               <iterate
-                     ifEmpty="false"
-                     operator="or">
-                  <and>
-                     <or>
-	                     <instanceof
-	                           value="org.eclipse.core.resources.IFile">
-	                     </instanceof>
-	                     <instanceof
-	                           value="org.eclipse.core.resources.IProject">
-	                     </instanceof>
-	                 </or>
-                     <test
-                           property="org.cauldron.sigil.isSigilProject"
-                           value="true">
-                     </test>
-                  </and>
-               </iterate>
-            </with>
-         </activeWhen>
-      </handler>      
-      <handler
-            class="org.cauldron.sigil.runtime.handlers.project.SelectionProjectHandler:uninstall"
-            commandId="org.apache.felix.sigil.runtime.commands.uninstallProject">
-         <activeWhen>
-            <with
-                  variable="selection">
-               <iterate
-                     ifEmpty="false"
-                     operator="or">
-                  <and>
-                     <or>
-	                     <instanceof
-	                           value="org.eclipse.core.resources.IFile">
-	                     </instanceof>
-	                     <instanceof
-	                           value="org.eclipse.core.resources.IProject">
-	                     </instanceof>
-	                 </or>
-                     <test
-                           property="org.cauldron.sigil.isSigilProject"
-                           value="true">
-                     </test>
-                  </and>
-               </iterate>
-            </with>
-         </activeWhen>
-      </handler>      
-      <handler
-            class="org.cauldron.sigil.runtime.handlers.project.SelectionProjectHandler:reinstall"
-            commandId="org.apache.felix.sigil.runtime.commands.reinstallProject">
-         <activeWhen>
-            <with
-                  variable="selection">
-               <iterate
-                     ifEmpty="false"
-                     operator="or">
-                  <and>
-                     <or>
-	                     <instanceof
-	                           value="org.eclipse.core.resources.IFile">
-	                     </instanceof>
-	                     <instanceof
-	                           value="org.eclipse.core.resources.IProject">
-	                     </instanceof>
-	                 </or>
-                     <test
-                           property="org.cauldron.sigil.isSigilProject"
-                           value="true">
-                     </test>
-                  </and>
-               </iterate>
-            </with>
-         </activeWhen>
-      </handler>      
-      <handler
-            class="org.cauldron.sigil.runtime.handlers.project.EditorProjectHandler:install"
-            commandId="org.apache.felix.sigil.runtime.commands.installProject">
-         <activeWhen>
-            <with
-                  variable="activePartId">
-               <equals
-                     value="org.cauldron.sigil.editors.SigilProjectEditor">
-               </equals>
-            </with>
-         </activeWhen>
-      </handler>
-      <handler
-            class="org.cauldron.sigil.runtime.handlers.project.EditorProjectHandler:uninstall"
-            commandId="org.apache.felix.sigil.runtime.commands.uninstallProject">
-         <activeWhen>
-            <with
-                  variable="activePartId">
-               <equals
-                     value="org.cauldron.sigil.editors.SigilProjectEditor">
-               </equals>
-            </with>
-         </activeWhen>
-      </handler>
-      <handler
-            class="org.cauldron.sigil.runtime.handlers.project.EditorProjectHandler:reinstall"
-            commandId="org.apache.felix.sigil.runtime.commands.reinstallProject">
-         <activeWhen>
-            <with
-                  variable="activePartId">
-               <equals
-                     value="org.cauldron.sigil.editors.SigilProjectEditor">
-               </equals>
-            </with>
-         </activeWhen>
-      </handler>
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="popup:org.eclipse.ui.popup.any">
-         <separator
-               name="org.cauldron.sigil.runtime.separator"
-               visible="true">
-         </separator>
-            <command
-                  commandId="org.apache.felix.sigil.runtime.commands.installProject"
-                  label="Install Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-               </visibleWhen>
-            </command>
-            <command
-                  commandId="org.apache.felix.sigil.runtime.commands.uninstallProject"
-                  label="Uninstall Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-               </visibleWhen>
-            </command>
-            <command
-                  commandId="org.apache.felix.sigil.runtime.commands.reinstallProject"
-                  label="Reinstall Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-               </visibleWhen>
-            </command>
-            <command
-                  commandId="org.apache.felix.sigil.runtime.commands.startProject"
-                  label="Start Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-               </visibleWhen>
-            </command>
-            <command
-                  commandId="org.apache.felix.sigil.runtime.commands.stopProject"
-                  label="Stop Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-               </visibleWhen>
-            </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.main.toolbar">
-         <toolbar
-               id="org.cauldron.sigil.runtime.toolbar1">
-            <command
-                  commandId="org.apache.felix.sigil.runtime.commands.installProject"
-                  label="Install Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-                  <with
-                        variable="activePartId">
-                     <equals
-                           value="org.cauldron.sigil.editors.SigilProjectEditor">
-                     </equals>
-                  </with>
-               </visibleWhen>
-            </command>
-            <command
-                  commandId="org.apache.felix.sigil.runtime.commands.uninstallProject"
-                  label="Uninstall Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-                  <with
-                        variable="activePartId">
-                     <equals
-                           value="org.cauldron.sigil.editors.SigilProjectEditor">
-                     </equals>
-                  </with>
-               </visibleWhen>
-            </command>
-            <command
-                  commandId="org.apache.felix.sigil.runtime.commands.reinstallProject"
-                  label="Re Install Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-                  <with
-                        variable="activePartId">
-                     <equals
-                           value="org.cauldron.sigil.editors.SigilProjectEditor">
-                     </equals>
-                  </with>
-               </visibleWhen>
-            </command>
-            <command
-                  commandId="org.apache.felix.sigil.runtime.commands.startProject"
-                  label="Start Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-                  <with
-                        variable="activePartId">
-                     <equals
-                           value="org.cauldron.sigil.editors.SigilProjectEditor">
-                     </equals>
-                  </with>
-               </visibleWhen>
-            </command>
-            <command
-                  commandId="org.apache.felix.sigil.runtime.commands.stopProject"
-                  label="Stop Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-                  <with
-                        variable="activePartId">
-                     <equals
-                           value="org.cauldron.sigil.editors.SigilProjectEditor">
-                     </equals>
-                  </with>
-               </visibleWhen>
-            </command>
-         </toolbar>
-      </menuContribution>
-   </extension>
-   <!-- extension
-         point="org.eclipse.ui.contexts">
-      <context
-            id="org.cauldron.sigil.runtime.contexts.compositeEditor"
-            name="Composite Editor"
-            parentId="org.eclipse.ui.textEditorScope">
-      </context>
-   </extension>
-   <extension
-         point="org.eclipse.ui.bindings">
-      <key
-            commandId="org.apache.felix.sigil.runtime.commands.installComposite"
-            contextId="org.cauldron.sigil.runtime.contexts.compositeEditor"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M1+I">
-      </key>
-      <key
-            commandId="org.apache.felix.sigil.runtime.commands.uninstallComposite"
-            contextId="org.cauldron.sigil.runtime.contexts.compositeEditor"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M1+U">
-      </key>
-      <key
-            commandId="org.apache.felix.sigil.runtime.commands.reinstallComposite"
-            contextId="org.cauldron.sigil.runtime.contexts.compositeEditor"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M1+M2+I">
-      </key>
-   </extension -->
-   <!-- extension
-         point="org.eclipse.ui.views">
-      <view
-            category="org.cauldron.sigil.ui.views"
-            class="org.cauldron.sigil.runtime.views.NewtonInstancesView"
-            icon="etc/images/newton.png"
-            id="org.cauldron.sigil.runtime.newtonInstancesView"
-            name="Newton Instances"
-            restorable="true">
-      </view>
-   </extension -->
-   <!-- extension
-         point="org.eclipse.core.runtime.adapters">
-      <factory
-            adaptableType="org.cauldron.sigil.runtime.registry.INewtonRegistry"
-            class="org.cauldron.sigil.runtime.views.DeferredAdapterFactory">
-         <adapter
-               type="org.eclipse.ui.progress.IDeferredWorkbenchAdapter">
-         </adapter>
-      </factory>
-      <factory
-            adaptableType="org.cauldron.sigil.runtime.registry.INewtonInstance"
-            class="org.cauldron.sigil.runtime.views.DeferredAdapterFactory">
-         <adapter
-               type="org.eclipse.ui.progress.IDeferredWorkbenchAdapter">
-         </adapter>
-      </factory>
-      <factory
-            adaptableType="org.cauldron.sigil.runtime.model.IBundleState"
-            class="org.cauldron.sigil.runtime.views.DeferredAdapterFactory">
-         <adapter
-               type="org.eclipse.ui.progress.IDeferredWorkbenchAdapter">
-         </adapter>
-      </factory>
-   </extension -->
-   <!-- extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.cauldron.sigil.ui.perspective1">
-         <viewShortcut
-               id="org.cauldron.sigil.runtime.newtonInstancesView">
-         </viewShortcut>
-      </perspectiveExtension>
-   </extension -->
-   <!-- extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.cauldron.sigil.runtime.prefs.PreferenceInitializer">
-      </initializer>
-   </extension -->
-   <!-- extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            category="org.cauldron.sigil.ui.preferences.SigilPreferencePage"
-            class="org.cauldron.sigil.runtime.prefs.RuntimePreferencesPage"
-            id="org.cauldron.sigil.runtime.preferences.RuntimePreferencesPage"
-            name="Runtime">
-      </page>
-   </extension -->
-   <!-- extension
-         point="org.cauldron.sigil.installbuilder">
-      <builder
-            class="org.cauldron.sigil.runtime.install.NewtonV1_2InstallBuilder">
-      </builder>
-      <builder
-            class="org.cauldron.sigil.runtime.install.NewtonV1_3InstallBuilder">
-      </builder>
-      <builder
-            class="org.cauldron.sigil.runtime.install.NewtonV1_4InstallBuilder">
-      </builder>
-   </extension -->
-   <!-- extension
-         point="org.cauldron.sigil.repositoryprovider">
-      <provider
-            class="org.cauldron.sigil.runtime.repository.PlatformRepositoryProvider"
-            defaultLevel="-2"
-            dynamic="false"
-            id="org.cauldron.sigil.runtime.provider"
-            type="OSGi Platform Repository">
-      </provider>
-   </extension -->
-</plugin>
diff --git a/sigil/eclipse/runtime/sigil.properties b/sigil/eclipse/runtime/sigil.properties
deleted file mode 100644
index dc85abf..0000000
--- a/sigil/eclipse/runtime/sigil.properties
+++ /dev/null
@@ -1,54 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--singleton: true
-
--bundles: \
-	org.apache.felix.sigil.eclipse.runtime, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-	icons, \
-	plugin.xml, \
-
--sourcedirs: \
-	src, \
-
--imports: \
-	org.apache.felix.sigil.common.model, \
-	org.apache.felix.sigil.common.model.eclipse, \
-	org.apache.felix.sigil.common.model.osgi, \
-	org.apache.felix.sigil.common.osgi, \
-	org.apache.felix.sigil.common.repository, \
-	org.apache.felix.sigil.common.runtime, \
-	org.apache.felix.sigil.eclipse, \
-	org.apache.felix.sigil.eclipse.install, \
-	org.apache.felix.sigil.eclipse.model.project, \
-	org.apache.felix.sigil.eclipse.ui, \
-	org.apache.felix.sigil.eclipse.ui.util, \
-	org.eclipse.core.commands.common;resolve=compile, \
-	org.eclipse.core.resources, \
-	org.eclipse.core.runtime, \
-	org.eclipse.jdt.core, \
-	org.eclipse.jdt.debug.ui.launchConfigurations, \
-	org.eclipse.jface.dialogs, \
-	org.eclipse.jface.viewers, \
-	org.eclipse.jface.window, \
-	org.eclipse.swt.widgets, \
-	org.osgi.framework, \
-
--requires: \
-	org.eclipse.core.jobs;version=3.4.1, \
-	org.eclipse.core.runtime;version=3.4.0, \
-	org.eclipse.debug.core;version=3.4.1, \
-	org.eclipse.debug.ui;version=3.4.2, \
-	org.eclipse.equinox.common;version=3.4.0, \
-	org.eclipse.jdt.launching;version=3.4.1, \
-	org.eclipse.swt;version=3.4.2, \
-	org.eclipse.ui.ide;version=3.4.2, \
-	org.eclipse.ui.workbench;version=3.4.2, \
-
-option;addMissingImports: false
-
-# end
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/LaunchHelper.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/LaunchHelper.java
deleted file mode 100644
index b2deb73..0000000
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/LaunchHelper.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.runtime;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.runtime.BundleForm;
-import org.apache.felix.sigil.common.runtime.Runtime;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.install.IOSGiInstall;
-import org.apache.felix.sigil.eclipse.runtime.config.OSGiLaunchConfigurationConstants;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.ILaunchConfiguration;
-
-public class LaunchHelper
-{
-
-    public static IOSGiInstall getInstall(ILaunchConfiguration config)
-    {
-        return null;
-    }
-
-    public static int getRetries(ILaunchConfiguration config)
-    {
-        return 5;
-    }
-
-    public static Properties buildClientProps(ILaunchConfiguration config)
-    {
-        Properties props = new Properties();
-        props.put(Runtime.ADDRESS_PROPERTY, "localhost");
-        props.put(Runtime.PORT_PROPERTY, "9090");
-        return props;
-    }
-
-    public static String[] getProgramArgs(ILaunchConfiguration config)
-    {
-        return new String[] { "-p", "9090", "-a", "localhost", "-c" };
-    }
-
-    public static long getBackoff(ILaunchConfiguration config)
-    {
-        return 1000;
-    }
-
-    public static URL toURL(String loc) throws MalformedURLException
-    {
-        URL url = null;
-        try
-        {
-            url = new URL(loc);
-        }
-        catch (MalformedURLException e)
-        {
-            IFile f = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(loc));
-            if (f.exists())
-            {
-                url = f.getLocation().toFile().toURL();
-            }
-            else
-            {
-                throw new MalformedURLException("Unknown file " + loc);
-            }
-        }
-        return url;
-    }
-
-    public static BundleForm getBundleForm(ILaunchConfiguration config)
-        throws CoreException
-    {
-        String loc = config.getAttribute(
-            OSGiLaunchConfigurationConstants.FORM_FILE_LOCATION, (String) null);
-        try
-        {
-            URL url = toURL(loc);
-            SigilCore.log("Resolving " + url);
-            return BundleForm.create(url);
-        }
-        catch (Exception e)
-        {
-            throw SigilCore.newCoreException("Failed to parse bundle form file", e);
-        }
-    }
-
-    public static String getRepositoryManagerName(ILaunchConfiguration config)
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java
deleted file mode 100644
index d95e2e2..0000000
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.runtime;
-
-import java.io.IOException;
-
-import java.net.ConnectException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.repository.IRepositoryManager;
-import org.apache.felix.sigil.common.runtime.BundleForm;
-import org.apache.felix.sigil.common.runtime.Client;
-import org.apache.felix.sigil.common.runtime.Main;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.install.IOSGiInstall;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
-import org.eclipse.debug.core.model.ILaunchConfigurationDelegate2;
-import org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate;
-import org.eclipse.jdt.launching.IVMInstall;
-import org.eclipse.jdt.launching.IVMRunner;
-import org.eclipse.jdt.launching.VMRunnerConfiguration;
-
-public class OSGiLauncher extends AbstractJavaLaunchConfigurationDelegate implements ILaunchConfigurationDelegate, ILaunchConfigurationDelegate2
-{
-
-    public void launch(ILaunchConfiguration config, String mode, ILaunch launch,
-        IProgressMonitor monitor) throws CoreException
-    {
-        IOSGiInstall osgi = LaunchHelper.getInstall(config);
-
-        VMRunnerConfiguration vmconfig = new VMRunnerConfiguration(Main.class.getName(),
-            buildClasspath(osgi, config));
-
-        String vm = getVMArguments(config);
-        if (vm != null && vm.trim().length() > 0)
-            vmconfig.setVMArguments(vm.split(" "));
-
-        IPath path = getWorkingDirectoryPath(config);
-        vmconfig.setWorkingDirectory(path == null ? null : path.toOSString());
-
-        vmconfig.setBootClassPath(getBootpath(config));
-        vmconfig.setEnvironment(getEnvironment(config));
-        vmconfig.setProgramArguments(LaunchHelper.getProgramArgs(config));
-
-        IVMInstall install = getVMInstall(config);
-
-        IVMRunner runner = install.getVMRunner(mode);
-
-        setDefaultSourceLocator(launch, config);
-
-        SigilCore.log("VM=" + install.getName());
-        SigilCore.log("Main=" + vmconfig.getClassToLaunch());
-        SigilCore.log("VMArgs=" + Arrays.asList(vmconfig.getVMArguments()));
-        SigilCore.log("Boot Classpath=" + Arrays.asList(vmconfig.getBootClassPath()));
-        SigilCore.log("Classpath=" + Arrays.asList(vmconfig.getClassPath()));
-        SigilCore.log("Args=" + Arrays.asList(vmconfig.getProgramArguments()));
-        SigilCore.log("Working Dir=" + vmconfig.getWorkingDirectory());
-
-        runner.run(vmconfig, launch, monitor);
-
-        Client client = connect(config);
-
-        BundleForm form = LaunchHelper.getBundleForm(config);
-
-        try
-        {
-            // TODO need to figure out a sensible repository manager for launch configs
-            IRepositoryManager manager = SigilCore.getGlobalRepositoryManager();
-            client.apply(form.resolve(new RuntimeBundleResolver(manager, config)));
-        }
-        catch (Exception e)
-        {
-            throw SigilCore.newCoreException("Failed to apply bundle form", e);
-        }
-
-        SigilCore.log("Connected " + client.isConnected());
-    }
-
-    private Client connect(ILaunchConfiguration config) throws CoreException
-    {
-        Properties props = LaunchHelper.buildClientProps(config);
-
-        int retry = LaunchHelper.getRetries(config);
-
-        Client client = null;
-
-        for (int i = 0; i < retry; i++)
-        {
-            client = new Client();
-            try
-            {
-                client.connect(props);
-                break;
-            }
-            catch (ConnectException e)
-            {
-                SigilCore.log("Failed to connect to client: " + e.getMessage());
-            }
-            catch (IOException e)
-            {
-                throw SigilCore.newCoreException("Failed to connect client", e);
-            }
-
-            try
-            {
-                Thread.sleep(LaunchHelper.getBackoff(config));
-            }
-            catch (InterruptedException e)
-            {
-                SigilCore.log("Interrupted during backoff");
-            }
-        }
-
-        if (client == null)
-        {
-            throw SigilCore.newCoreException(
-                "Failed to connect client after retries, check error log for details",
-                null);
-        }
-
-        return client;
-    }
-
-    public String[] getBootpath(ILaunchConfiguration configuration) throws CoreException
-    {
-        String[] bootpath = super.getBootpath(configuration);
-
-        ArrayList<String> filtered = new ArrayList<String>();
-
-        if (bootpath != null)
-        {
-            for (String bp : bootpath)
-            {
-                if (!SigilCore.isBundledPath(bp))
-                {
-                    filtered.add(bp);
-                }
-            }
-        }
-
-        return filtered.toArray(new String[filtered.size()]);
-    }
-
-    private String[] buildClasspath(IOSGiInstall osgi, ILaunchConfiguration config)
-        throws CoreException
-    {
-        ArrayList<String> cp = new ArrayList<String>();
-
-        cp.add(Main.class.getProtectionDomain().getCodeSource().getLocation().getFile());
-
-        for (String c : getClasspath(config))
-        {
-            cp.add(c);
-        }
-
-        if (osgi != null)
-        {
-            for (String c : osgi.getType().getClassPath())
-            {
-                cp.add(c);
-            }
-        }
-
-        return cp.toArray(new String[cp.size()]);
-    }
-
-}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/RuntimeBundleResolver.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/RuntimeBundleResolver.java
deleted file mode 100644
index bbb1b50..0000000
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/RuntimeBundleResolver.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package org.apache.felix.sigil.eclipse.runtime;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.repository.IBundleResolver;
-import org.apache.felix.sigil.common.repository.IRepositoryManager;
-import org.apache.felix.sigil.common.repository.IResolution;
-import org.apache.felix.sigil.common.repository.ResolutionConfig;
-import org.apache.felix.sigil.common.repository.ResolutionException;
-import org.apache.felix.sigil.common.runtime.BundleForm.ResolutionContext;
-import org.apache.felix.sigil.common.runtime.BundleForm.Resolver;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.runtime.source.SigilSourcePathProvider;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.osgi.framework.Version;
-
-public class RuntimeBundleResolver implements ResolutionContext
-{
-
-    public class SigilBundleResolver implements Resolver
-    {
-        public URI[] resolve(URI base) throws URISyntaxException
-        {
-            ArrayList<URI> uris = new ArrayList<URI>(1);
-
-            IBundleResolver resolver = manager.getBundleResolver();
-            IRequiredBundle element = ModelElementFactory.getInstance().newModelElement(
-                IRequiredBundle.class);
-            String[] parts = base.getSchemeSpecificPart().split(":");
-            switch (parts.length)
-            {
-                case 2:
-                    Version v = Version.parseVersion(parts[1]);
-                    element.setVersions(new VersionRange(false, v, v, false));
-                    // fall through on purpose
-                case 1:
-                    element.setSymbolicName(parts[0]);
-                    break;
-                default:
-                    throw new URISyntaxException(base.toString(),
-                        "Unexpected number of parts: " + parts.length);
-            }
-            try
-            {
-                ResolutionConfig config = new ResolutionConfig(
-                    ResolutionConfig.IGNORE_ERRORS);
-                IResolution resolution = resolver.resolve(element, config, null);
-                if (resolution.getBundles().isEmpty())
-                {
-                    SigilCore.error("Failed to resolve bundle for " + base);
-                }
-                for (ISigilBundle b : resolution.getBundles())
-                {
-                    ISigilProjectModel p = b.getAncestor(ISigilProjectModel.class);
-                    if (p != null)
-                    {
-                        uris.add(p.findBundleLocation().toFile().toURI());
-                        SigilCore.log("Adding project source to source path "
-                            + p.getName());
-                        SigilSourcePathProvider.addProjectSource(launchConfig, p);
-                    }
-                    else
-                    {
-                        b.synchronize(null);
-                        uris.add(b.getLocation().toURI());
-                    }
-                }
-            }
-            catch (ResolutionException e)
-            {
-                SigilCore.error("Failed to resolve " + base, e);
-            }
-            catch (IOException e)
-            {
-                SigilCore.error("Failed to synchronize " + base, e);
-            }
-            catch (CoreException e)
-            {
-                SigilCore.error("Failed to access " + base, e);
-            }
-            SigilCore.log("Resolved " + uris);
-            return uris.toArray(new URI[uris.size()]);
-        }
-    }
-
-    private final IRepositoryManager manager;
-    private final ILaunchConfiguration launchConfig;
-
-    public RuntimeBundleResolver(IRepositoryManager manager, ILaunchConfiguration launchConfig)
-    {
-        this.manager = manager;
-        this.launchConfig = launchConfig;
-    }
-
-    public Resolver findResolver(URI uri)
-    {
-        SigilCore.log("Finding resolver for " + uri.getScheme());
-        if ("sigil".equals(uri.getScheme()))
-        {
-            SigilCore.log("Found resolver for " + uri.getScheme());
-            return new SigilBundleResolver();
-        }
-        return null;
-    }
-
-}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/FilteredModelView.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/FilteredModelView.java
deleted file mode 100644
index ecfba3d..0000000
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/FilteredModelView.java
+++ /dev/null
@@ -1,242 +0,0 @@
-package org.apache.felix.sigil.eclipse.runtime.config;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultLabelProvider;
-import org.apache.felix.sigil.eclipse.ui.util.IElementDescriptor;
-import org.apache.felix.sigil.eclipse.ui.util.IFilter;
-import org.apache.felix.sigil.eclipse.ui.util.UIHelper;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-
-public class FilteredModelView<T> extends Composite
-{
-    private ArrayList<T> selected = new ArrayList<T>();
-    private ArrayList<T> elements = new ArrayList<T>();
-    private IElementDescriptor<T> elementDescriptor = UIHelper.getDefaultElementDescriptor();
-    private IFilter<T> filter = UIHelper.getDefaultFilter();
-    private StructuredViewer viewer;
-    private String txt = "";
-
-    public FilteredModelView(Composite parent, int style)
-    {
-        super(parent, style);
-        initLayout();
-    }
-
-    public List<T> getSelectedElements()
-    {
-        return selected;
-    }
-
-    public List<T> getElements()
-    {
-        return elements;
-    }
-
-    public void addElement(T element)
-    {
-        elements.add(element);
-        refresh();
-    }
-
-    public void addElements(Collection<T> elements)
-    {
-        this.elements.addAll(elements);
-        refresh();
-    }
-
-    public void removeElement(T element)
-    {
-        elements.remove(element);
-        refresh();
-    }
-
-    public void removeElements(Collection<T> elements)
-    {
-        this.elements.removeAll(elements);
-        refresh();
-    }
-
-    public void refresh()
-    {
-        SigilUI.runInUI(new Runnable()
-        {
-
-            public void run()
-            {
-                viewer.refresh();
-            }
-        });
-    }
-
-    private void initLayout()
-    {
-        Text bundleTxt = createSelectionBox(this);
-
-        Control view = createViewBox(this);
-
-        // layout
-        bundleTxt.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        view.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-        setLayout(new GridLayout(1, false));
-    }
-
-    private Control createViewBox(Composite parent)
-    {
-        Table table = new Table(this, SWT.MULTI);
-
-        viewer = createViewer(table);
-
-        viewer.setContentProvider(new ArrayContentProvider());
-
-        viewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            @SuppressWarnings("unchecked")
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                if (event.getSelection().isEmpty())
-                {
-                    selected.clear();
-                }
-                else
-                {
-                    IStructuredSelection sel = (IStructuredSelection) event.getSelection();
-                    selected.addAll(sel.toList());
-                }
-            }
-        });
-
-        viewer.setInput(elements);
-
-        viewer.setFilters(new ViewerFilter[] { new ViewerFilter()
-        {
-            @SuppressWarnings("unchecked")
-            @Override
-            public boolean select(Viewer viewer, Object parentElement, Object element)
-            {
-                if (filter.select((T) element))
-                {
-                    String name = elementDescriptor.getName((T) element);
-                    return name.startsWith(txt);
-                }
-                else
-                {
-                    return false;
-                }
-            }
-        } });
-
-        return table;
-    }
-
-    protected StructuredViewer createViewer(Table table)
-    {
-        TableViewer tableViewer = new TableViewer(table);
-
-        tableViewer.setLabelProvider(new DefaultLabelProvider()
-        {
-
-            public Image getImage(Object arg0)
-            {
-                return null;
-            }
-
-            @SuppressWarnings("unchecked")
-            public String getText(Object element)
-            {
-                return elementDescriptor.getLabel((T) element);
-            }
-
-        });
-
-        return tableViewer;
-    }
-
-    private Text createSelectionBox(Composite parent)
-    {
-        final Text txtSelection = new Text(parent, SWT.SEARCH);
-
-        txtSelection.addKeyListener(new KeyAdapter()
-        {
-            @Override
-            public void keyReleased(KeyEvent e)
-            {
-                txt = txtSelection.getText();
-                refresh();
-            }
-        });
-        return txtSelection;
-    }
-
-    /*
-     *         ControlDecoration selectionDecor = new ControlDecoration( txtSelection, SWT.LEFT | SWT.TOP );
-        FieldDecoration proposalDecor = FieldDecorationRegistry.getDefault().getFieldDecoration(
-            FieldDecorationRegistry.DEC_CONTENT_PROPOSAL );
-        selectionDecor.setImage( proposalDecor.getImage() );
-        selectionDecor.setDescriptionText( proposalDecor.getDescription() );
-
-        ExclusionContentProposalProvider<T> proposalProvider = new ExclusionContentProposalProvider<T>(
-            elements, filter, elementDescriptor );
-
-        ContentProposalAdapter proposalAdapter = new ContentProposalAdapter( txtSelection, new TextContentAdapter(),
-            proposalProvider, null, null );
-        
-        proposalAdapter.addContentProposalListener( new IContentProposalListener() {
-            public void proposalAccepted( IContentProposal proposal )
-            {
-                WrappedContentProposal<T> valueProposal = (org.apache.felix.sigil.ui.eclipse.ui.util.WrappedContentProposal<T> ) proposal;
-                T selected = valueProposal.getElement();
-                selection = new ArrayList<E>( 1 );
-                selection.add( selected );
-            }            
-        });
-        
-        proposalAdapter.setProposalAcceptanceStyle( ContentProposalAdapter.PROPOSAL_REPLACE );
-
-     */
-
-    public void setElementDescriptor(IElementDescriptor<T> elementDescriptor)
-    {
-        if (elementDescriptor == null)
-        {
-            elementDescriptor = UIHelper.getDefaultElementDescriptor();
-        }
-        this.elementDescriptor = elementDescriptor;
-    }
-
-    public IElementDescriptor<T> getElementDescriptor()
-    {
-        return elementDescriptor;
-    }
-
-    public void setFilter(IFilter<T> filter)
-    {
-        if (filter == null)
-        {
-            filter = UIHelper.getDefaultFilter();
-        }
-        this.filter = filter;
-    }
-
-}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/FormSelectionDialog.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/FormSelectionDialog.java
deleted file mode 100644
index 001a16d..0000000
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/FormSelectionDialog.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.apache.felix.sigil.eclipse.runtime.config;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.model.BaseWorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-public class FormSelectionDialog extends Dialog
-{
-    private IFile formFile;
-
-    public FormSelectionDialog(Shell parent)
-    {
-        super(parent);
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent)
-    {
-        Composite composite = (Composite) super.createDialogArea(parent);
-        new Label(composite, SWT.NONE).setText("Select bundle form file from workspace:");
-        Tree tree = new Tree(composite, SWT.SINGLE);
-
-        TreeViewer viewer = new TreeViewer(tree);
-        viewer.setContentProvider(new BaseWorkbenchContentProvider());
-        viewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
-        viewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent evt)
-            {
-                if (evt.getSelection().isEmpty())
-                {
-                    updateFile(null);
-                }
-                else
-                {
-                    StructuredSelection sel = (StructuredSelection) evt.getSelection();
-                    IResource r = (IResource) sel.getFirstElement();
-                    if (r instanceof IFile)
-                    {
-                        IFile f = (IFile) r;
-                        updateFile(f);
-                    }
-                    else
-                    {
-                        updateFile(null);
-                    }
-                }
-            }
-        });
-        viewer.setLabelProvider(new WorkbenchLabelProvider());
-
-        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-        return composite;
-    }
-
-    public IFile getFormFile()
-    {
-        return formFile;
-    }
-
-    protected void updateFile(IFile file)
-    {
-        formFile = file;
-
-        if (file == null)
-        {
-            getButton(Window.OK).setEnabled(false);
-        }
-        else
-        {
-            getButton(Window.OK).setEnabled(true);
-        }
-    }
-
-}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiLaunchConfigurationConstants.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiLaunchConfigurationConstants.java
deleted file mode 100644
index 47a3d36..0000000
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiLaunchConfigurationConstants.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.apache.felix.sigil.eclipse.runtime.config;
-
-public interface OSGiLaunchConfigurationConstants
-{
-
-    String FORM_FILE_LOCATION = "org.apache.felix.sigil.form.location";
-    String AUTOMATIC_ADD = "org.apache.felix.sigil.automatic.add";
-    String CLASSPATH_PROVIDER = "org.apache.felix.sigil.classpath.Provider";
-
-}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiLaunchConfigurationTab.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiLaunchConfigurationTab.java
deleted file mode 100644
index 668fed3..0000000
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiLaunchConfigurationTab.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.runtime.config;
-
-import java.net.URL;
-
-import org.apache.felix.sigil.common.runtime.BundleForm;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.runtime.LaunchHelper;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author dave
- *
- */
-public class OSGiLaunchConfigurationTab extends AbstractLaunchConfigurationTab
-{
-
-    private Text formText;
-    private String formLocation;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-     */
-    public String getName()
-    {
-        return "OSGi";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createControl(Composite parent)
-    {
-        Composite configurationView = new Composite(parent, SWT.NONE);
-        new Label(configurationView, SWT.NONE).setText("Form");
-
-        // components
-        formText = new Text(configurationView, SWT.BORDER);
-
-        // layout
-        formText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-
-        formText.addKeyListener(new KeyAdapter()
-        {
-            @Override
-            public void keyReleased(KeyEvent e)
-            {
-                updateLocation();
-            }
-        });
-
-        Button browse = new Button(configurationView, SWT.PUSH);
-        browse.setText("Browse");
-
-        browse.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                FormSelectionDialog dialog = new FormSelectionDialog(getShell());
-                if (dialog.open() == Window.OK)
-                {
-                    formLocation = dialog.getFormFile().getFullPath().toOSString();
-                    formText.setText(formLocation);
-                    updateLocation();
-                }
-            }
-        });
-
-        configurationView.setLayout(new GridLayout(3, false));
-
-        setControl(configurationView);
-    }
-
-    private void updateLocation()
-    {
-        String loc = formText.getText();
-        if (loc.trim().length() > 0)
-        {
-            try
-            {
-                URL url = LaunchHelper.toURL(loc);
-                SigilCore.log("Resolving " + url);
-                BundleForm.create(url);
-                setErrorMessage(null);
-                setDirty(true);
-            }
-            catch (Exception e)
-            {
-                SigilCore.warn("Failed to resolve bundle form", e);
-                setErrorMessage("Invalid form file " + e.getMessage());
-            }
-        }
-        else
-        {
-            setErrorMessage("Missing form file");
-        }
-        updateLaunchConfigurationDialog();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-     */
-    public void initializeFrom(ILaunchConfiguration config)
-    {
-        try
-        {
-            formLocation = config.getAttribute(
-                OSGiLaunchConfigurationConstants.FORM_FILE_LOCATION, "");
-            formText.setText(formLocation);
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to initialise launch configuration view", e);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-     */
-    public void performApply(ILaunchConfigurationWorkingCopy config)
-    {
-        config.setAttribute(OSGiLaunchConfigurationConstants.FORM_FILE_LOCATION,
-            formLocation);
-        config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH_PROVIDER,
-            OSGiLaunchConfigurationConstants.CLASSPATH_PROVIDER);
-        config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER,
-            OSGiLaunchConfigurationConstants.CLASSPATH_PROVIDER);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-     */
-    public void setDefaults(ILaunchConfigurationWorkingCopy config)
-    {
-        config.setAttribute(OSGiLaunchConfigurationConstants.FORM_FILE_LOCATION,
-            (String) null);
-    }
-}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiLaunchConfigurationTabGroup.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiLaunchConfigurationTabGroup.java
deleted file mode 100644
index 1acaa4e..0000000
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiLaunchConfigurationTabGroup.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.runtime.config;
-
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
-import org.eclipse.debug.ui.CommonTab;
-import org.eclipse.debug.ui.EnvironmentTab;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.jdt.debug.ui.launchConfigurations.JavaArgumentsTab;
-import org.eclipse.jdt.debug.ui.launchConfigurations.JavaClasspathTab;
-
-/**
- * @author dave
- *
- */
-public class OSGiLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup
-{
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#createTabs(org.eclipse.debug.ui.ILaunchConfigurationDialog, java.lang.String)
-     */
-    public void createTabs(ILaunchConfigurationDialog arg0, String arg1)
-    {
-        ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
-                new OSGiLaunchConfigurationTab(), new CommonTab(),
-                new JavaArgumentsTab(), new JavaClasspathTab(), new EnvironmentTab() };
-        setTabs(tabs);
-    }
-
-}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/shortcut/OSGiLaunchShortCut.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/shortcut/OSGiLaunchShortCut.java
deleted file mode 100644
index 7e2f426..0000000
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/shortcut/OSGiLaunchShortCut.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.runtime.shortcut;
-
-import org.eclipse.debug.ui.ILaunchShortcut;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * @author dave
- *
- */
-public class OSGiLaunchShortCut implements ILaunchShortcut
-{
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchShortcut#launch(org.eclipse.jface.viewers.ISelection, java.lang.String)
-     */
-    public void launch(ISelection arg0, String arg1)
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchShortcut#launch(org.eclipse.ui.IEditorPart, java.lang.String)
-     */
-    public void launch(IEditorPart arg0, String arg1)
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/source/SigilSourcePathProvider.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/source/SigilSourcePathProvider.java
deleted file mode 100644
index 31c6091..0000000
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/source/SigilSourcePathProvider.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package org.apache.felix.sigil.eclipse.runtime.source;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.runtime.config.OSGiLaunchConfigurationConstants;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
-import org.eclipse.jdt.launching.JavaRuntime;
-import org.eclipse.jdt.launching.StandardSourcePathProvider;
-
-public class SigilSourcePathProvider extends StandardSourcePathProvider
-{
-    private static HashMap<ILaunchConfiguration, Set<IRuntimeClasspathEntry>> dynamicRuntime = new HashMap<ILaunchConfiguration, Set<IRuntimeClasspathEntry>>();
-
-    public IRuntimeClasspathEntry[] resolveClasspath(IRuntimeClasspathEntry[] entries,
-        ILaunchConfiguration configuration) throws CoreException
-    {
-        ArrayList<IRuntimeClasspathEntry> all = new ArrayList<IRuntimeClasspathEntry>(
-            entries.length);
-
-        all.addAll(workbenchSourcePath(entries, configuration));
-        //        all.addAll( launchOverridePath( configuration ) );
-        //        all.addAll( newtonSourcePath( configuration ) );
-        Set<IRuntimeClasspathEntry> dynamic = dynamicRuntime.get(configuration);
-        if (dynamic != null)
-        {
-            all.addAll(dynamic);
-        }
-
-        return (IRuntimeClasspathEntry[]) all.toArray(new IRuntimeClasspathEntry[all.size()]);
-    }
-
-    private List<IRuntimeClasspathEntry> workbenchSourcePath(
-        IRuntimeClasspathEntry[] entries, ILaunchConfiguration configuration)
-        throws CoreException
-    {
-        return Arrays.asList(super.resolveClasspath(entries, configuration));
-    }
-
-    private Collection<IRuntimeClasspathEntry> launchOverridePath(
-        ILaunchConfiguration configuration) throws CoreException
-    {
-        ArrayList<IRuntimeClasspathEntry> overrides = new ArrayList<IRuntimeClasspathEntry>();
-
-        if (configuration.getAttribute(OSGiLaunchConfigurationConstants.AUTOMATIC_ADD,
-            true))
-        {
-            for (ISigilProjectModel n : SigilCore.getRoot().getProjects())
-            {
-                overrides.add(JavaRuntime.newProjectRuntimeClasspathEntry(n.getJavaModel()));
-            }
-        }
-
-        return overrides;
-    }
-
-    public static void addProjectSource(ILaunchConfiguration config,
-        ISigilProjectModel project)
-    {
-        Set<IRuntimeClasspathEntry> dynamic = dynamicRuntime.get(config);
-
-        if (dynamic == null)
-        {
-            dynamic = new HashSet<IRuntimeClasspathEntry>();
-            dynamicRuntime.put(config, dynamic);
-        }
-
-        IJavaProject javaProject = project.getJavaModel();
-        IRuntimeClasspathEntry cp = JavaRuntime.newProjectRuntimeClasspathEntry(javaProject);
-
-        dynamic.add(cp);
-    }
-
-    //    private List<IRuntimeClasspathEntry> newtonSourcePath( ILaunchConfiguration configuration ) throws CoreException {
-    //        List<IRuntimeClasspathEntry> all = new ArrayList<IRuntimeClasspathEntry>();
-    //        
-    ////        Collection<IPath> jars = findNewtonJars( configuration );
-    //        
-    ////        IPath source = findSourcePath( configuration );
-    //        
-    ////        for ( IPath jar : jars ) {
-    ////            IRuntimeClasspathEntry cp = JavaRuntime.newArchiveRuntimeClasspathEntry(jar);
-    ////            
-    ////            if ( source != null ) {
-    ////                cp.setSourceAttachmentPath( source );
-    ////                cp.setSourceAttachmentRootPath( findSrcDir( source ) );
-    ////            }
-    ////            cp.setClasspathProperty(IRuntimeClasspathEntry.USER_CLASSES);
-    ////            
-    ////            all.add( cp );
-    ////        }
-    //                
-    //        return all;
-    //    }
-
-    //    @SuppressWarnings("unchecked")
-    //    private IPath findSrcDir( IPath sourceZip ) throws CoreException {
-    //        ZipFile zip = null;
-    //        
-    //        IPath path = null;
-    //        
-    //        try {
-    //            File file = sourceZip.toFile();
-    //            if (file.exists() && file.isFile() ) {
-    //                zip = new ZipFile(file);
-    //                
-    //                for ( Enumeration e = zip.entries(); e.hasMoreElements(); ) {
-    //                    ZipEntry entry = (ZipEntry) e.nextElement();
-    //                    if ( entry.getName().endsWith( "src/" ) ); {
-    //                        path = new Path( entry.getName() );
-    //                        break;
-    //                    }
-    //                }
-    //            } // else return null;
-    //        }
-    //        catch (ZipException e) {
-    //            throw SigilCore.newCoreException("Failed to open source zip:" + sourceZip.toFile(), e);
-    //        }
-    //        catch (IOException e) {
-    //            throw SigilCore.newCoreException("Failed to open source zip" + sourceZip.toFile(), e);
-    //        }
-    //        finally {
-    //            if ( zip != null ) {
-    //                try {
-    //                    zip.close();
-    //                }
-    //                catch (IOException e) {
-    //                    SigilCore.error( "Failed to close src zip", e);
-    //                }
-    //            }
-    //        }
-    //        
-    //        return path;
-    //    }
-
-    //    private Collection<IPath> findNewtonJars( ILaunchConfiguration configuration ) throws CoreException {
-    //        ArrayList<IPath> paths = new ArrayList<IPath>();
-    //        
-    //        INewtonInstall install = NewtonLaunchConfigurationHelper.getNewtonInstall(configuration);
-    //        
-    //        for ( IPath path : install.getType().getDefaultBundleLocations() ) {
-    //            paths.add(path);
-    //        }
-    //        
-    //        return paths;
-    //    }       
-
-    //    private IPath findSourcePath( ILaunchConfiguration configuration ) throws CoreException {
-    //        INewtonInstall install = NewtonLaunchConfigurationHelper.getNewtonInstall(configuration);
-    //        return install.getType().getSourceLocation();
-    //    }    
-}
diff --git a/sigil/eclipse/search/.classpath b/sigil/eclipse/search/.classpath
deleted file mode 100644
index 735b84e..0000000
--- a/sigil/eclipse/search/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="lib" path="lib/bcel.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/eclipse/search/.project b/sigil/eclipse/search/.project
deleted file mode 100644
index bbe43a8..0000000
--- a/sigil/eclipse/search/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.eclipse.search</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/eclipse/search/.settings/org.eclipse.jdt.core.prefs b/sigil/eclipse/search/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index b75ebb9..0000000
--- a/sigil/eclipse/search/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,263 +0,0 @@
-#Thu Sep 17 16:10:46 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/eclipse/search/.settings/org.eclipse.jdt.ui.prefs b/sigil/eclipse/search/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 2563a2b..0000000
--- a/sigil/eclipse/search/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:10:46 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/eclipse/search/DEPENDENCIES b/sigil/eclipse/search/DEPENDENCIES
deleted file mode 100644
index 54f2b58..0000000
--- a/sigil/eclipse/search/DEPENDENCIES
+++ /dev/null
@@ -1,26 +0,0 @@
-Apache Felix Sigil Eclipse Search
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed by the The Eclipse Foundation
-(http://www.eclipse.org)
-Copyright © 2010 The Eclipse Foundation. All Rights Reserved.
-Licensed under the Eclipse Public License - v 1.0.
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
-- Eclipse Public License - v 1.0
diff --git a/sigil/eclipse/search/NOTICE b/sigil/eclipse/search/NOTICE
deleted file mode 100644
index bdd75e9..0000000
--- a/sigil/eclipse/search/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Eclipse Search
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/eclipse/search/build.xml b/sigil/eclipse/search/build.xml
deleted file mode 100644
index a0d8ad5..0000000
--- a/sigil/eclipse/search/build.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="eclipse.search" default="build"
-   xmlns:ivy="antlib:org.apache.ivy.ant">
-      <import file="../build.xml"/>
-      <target name="init">
-        <ivy:retrieve organisation="org.apache" module="bcel" revision="5.2" inline="true" pattern="lib/[artifact].[ext]"/>
-      </target>
-</project>
diff --git a/sigil/eclipse/search/ivy.xml b/sigil/eclipse/search/ivy.xml
deleted file mode 100644
index e0b5e6d..0000000
--- a/sigil/eclipse/search/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.eclipse.search"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.eclipse.search" />
-   </publications>
-</ivy-module>
diff --git a/sigil/eclipse/search/sigil.properties b/sigil/eclipse/search/sigil.properties
deleted file mode 100644
index 52d803d..0000000
--- a/sigil/eclipse/search/sigil.properties
+++ /dev/null
@@ -1,44 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--activator: org.apache.felix.sigil.search.SigilSearch
-
--singleton: true
-
--bundles: \
-	org.apache.felix.sigil.eclipse.search, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-
--sourcedirs: \
-	src, \
-
--exports: \
-	org.apache.felix.sigil.search, \
-
--imports: \
-	org.apache.felix.sigil.common.model, \
-	org.apache.felix.sigil.common.model.eclipse, \
-	org.apache.felix.sigil.common.model.osgi, \
-	org.apache.felix.sigil.common.osgi, \
-	org.apache.felix.sigil.common.repository, \
-	org.apache.felix.sigil.eclipse, \
-	org.apache.felix.sigil.eclipse.model.project, \
-	org.apache.felix.sigil.eclipse.model.util, \
-	org.apache.felix.sigil.search, \
-	org.eclipse.jdt.core, \
-	org.eclipse.ui.plugin, \
-	org.osgi.framework, \
-
--libs: \
-	lib/bcel.jar;kind=classpath, \
-
--requires: \
-	org.eclipse.core.runtime;version=3.4.0, \
-	org.eclipse.equinox.common;version=3.4.0, \
-
-header;Bundle-ActivationPolicy: lazy	
-
-# end
diff --git a/sigil/eclipse/search/src/org/apache/felix/sigil/search/ISearchResult.java b/sigil/eclipse/search/src/org/apache/felix/sigil/search/ISearchResult.java
deleted file mode 100644
index 568ada8..0000000
--- a/sigil/eclipse/search/src/org/apache/felix/sigil/search/ISearchResult.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.search;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-
-public interface ISearchResult
-{
-    ISigilBundle getProvider();
-
-    IPackageExport getExport();
-
-    String getPackageName();
-
-    String getClassName();
-}
diff --git a/sigil/eclipse/search/src/org/apache/felix/sigil/search/SigilSearch.java b/sigil/eclipse/search/src/org/apache/felix/sigil/search/SigilSearch.java
deleted file mode 100644
index ba587a1..0000000
--- a/sigil/eclipse/search/src/org/apache/felix/sigil/search/SigilSearch.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.search;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.regex.Pattern;
-
-import org.apache.bcel.classfile.ClassParser;
-import org.apache.bcel.classfile.JavaClass;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryChangeListener;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-import org.apache.felix.sigil.common.repository.RepositoryChangeEvent;
-import org.apache.felix.sigil.eclipse.PathUtil;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.apache.felix.sigil.search.index.Index;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class SigilSearch extends AbstractUIPlugin
-{
-
-    // The plug-in ID
-    public static final String PLUGIN_ID = "org.apache.felix.sigil.eclipse.search";
-
-    private static final String CLASS_EXTENSION = ".class";
-
-    // The shared instance
-    private static SigilSearch plugin;
-    private static Index index;
-
-    /**
-     * The constructor
-     */
-    public SigilSearch()
-    {
-    }
-
-    public static List<ISearchResult> findProviders(String fullyQualifiedName,
-        ISigilProjectModel sigil, IProgressMonitor monitor)
-    {
-        listen(sigil);
-        return index.findProviders(fullyQualifiedName, monitor);
-    }
-
-    public static List<ISearchResult> findProviders(Pattern namePattern,
-        ISigilProjectModel sigil, IProgressMonitor monitor)
-    {
-        listen(sigil);
-        return index.findProviders(namePattern, monitor);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     */
-    public void start(BundleContext context) throws Exception
-    {
-        super.start(context);
-        plugin = this;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     */
-    public void stop(BundleContext context) throws Exception
-    {
-        plugin = null;
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static SigilSearch getDefault()
-    {
-        return plugin;
-    }
-
-    private static void listen(ISigilProjectModel sigil)
-    {
-        synchronized (plugin)
-        {
-            if (index == null)
-            {
-                index = new Index();
-                for (IBundleRepository rep : sigil.getRepositoryManager().getRepositories())
-                {
-                    index(index, rep);
-                }
-
-                sigil.getRepositoryManager().addRepositoryChangeListener(
-                    new IRepositoryChangeListener()
-                    {
-                        public void repositoryChanged(RepositoryChangeEvent event)
-                        {
-                            index(index, event.getRepository());
-                        }
-                    });
-            }
-        }
-    }
-
-    private static void index(final Index index, final IBundleRepository rep)
-    {
-        index.delete(rep);
-        rep.accept(new IRepositoryVisitor()
-        {
-            public boolean visit(ISigilBundle bundle)
-            {
-                ISigilProjectModel p = bundle.getAncestor(ISigilProjectModel.class);
-                if (p == null)
-                {
-                    if (bundle.isSynchronized())
-                    {
-                        IPath loc = PathUtil.newPathIfExists(bundle.getLocation());
-                        if (loc == null)
-                        {
-                            SigilCore.error("Location is null for " + bundle);
-                        }
-                        else
-                        {
-                            if (loc.isAbsolute())
-                            {
-                                indexJar(rep, bundle, loc);
-                            }
-                        }
-                    }
-                }
-                else
-                {
-                    indexProject(rep, p);
-                }
-                return true;
-            }
-        });
-    }
-
-    private static void indexProject(IBundleRepository rep, ISigilProjectModel sigil)
-    {
-        try
-        {
-            for (ICompilationUnit unit : JavaHelper.findCompilationUnits(sigil))
-            {
-                IPackageFragment p = (IPackageFragment) unit.getParent();
-                ISigilBundle b = sigil.getBundle();
-                IPackageExport export = b.findExport(p.getElementName());
-                index.addEntry(unit, rep, b, export != null);
-            }
-        }
-        catch (JavaModelException e)
-        {
-            SigilCore.error("Failed to index project", e);
-        }
-    }
-
-    private static void indexJar(IBundleRepository rep, ISigilBundle bundle, IPath loc)
-    {
-        JarFile jar = null;
-        try
-        {
-            jar = new JarFile(loc.toOSString());
-            for (Map.Entry<JarEntry, IPackageExport> export : findExportedClasses(bundle,
-                jar).entrySet())
-            {
-                JarEntry entry = export.getKey();
-                InputStream in = null;
-                try
-                {
-                    in = jar.getInputStream(entry);
-                    ClassParser parser = new ClassParser(in, entry.getName());
-                    JavaClass c = parser.parse();
-                    index.addEntry(c, rep, bundle, true);
-                }
-                finally
-                {
-                    if (in != null)
-                    {
-                        in.close();
-                    }
-                }
-            }
-        }
-        catch (IOException e)
-        {
-            SigilCore.error("Failed to read jar " + loc, e);
-        }
-        finally
-        {
-            if (jar != null)
-            {
-                try
-                {
-                    jar.close();
-                }
-                catch (IOException e)
-                {
-                    SigilCore.error("Failed to close jar " + loc, e);
-                }
-            }
-        }
-    }
-
-    private static Map<JarEntry, IPackageExport> findExportedClasses(ISigilBundle bundle,
-        JarFile jar)
-    {
-        HashMap<JarEntry, IPackageExport> found = new HashMap<JarEntry, IPackageExport>();
-
-        IPackageExport[] exports = bundle.getBundleInfo().childrenOfType(
-            IPackageExport.class);
-        if (exports.length > 0)
-        {
-            Arrays.sort(exports, new Comparator<IPackageExport>()
-            {
-                public int compare(IPackageExport o1, IPackageExport o2)
-                {
-                    return -1 * o1.compareTo(o2);
-                }
-            });
-            for (Enumeration<JarEntry> e = jar.entries(); e.hasMoreElements();)
-            {
-                JarEntry entry = e.nextElement();
-                String className = toClassName(entry);
-                if (className != null)
-                {
-                    IPackageExport ex = findExport(className, exports);
-
-                    if (found != null)
-                    {
-                        found.put(entry, ex);
-                    }
-                }
-            }
-        }
-
-        return found;
-    }
-
-    private static IPackageExport findExport(String className, IPackageExport[] exports)
-    {
-        for (IPackageExport e : exports)
-        {
-            if (className.startsWith(e.getPackageName()))
-            {
-                return e;
-            }
-        }
-        return null;
-    }
-
-    private static String toClassName(JarEntry entry)
-    {
-        String name = entry.getName();
-        if (name.endsWith(CLASS_EXTENSION))
-        {
-            name = name.substring(0, name.length() - CLASS_EXTENSION.length());
-            name = name.replace('/', '.');
-            return name;
-        }
-        else
-        {
-            return null;
-        }
-    }
-}
diff --git a/sigil/eclipse/search/src/org/apache/felix/sigil/search/index/Index.java b/sigil/eclipse/search/src/org/apache/felix/sigil/search/index/Index.java
deleted file mode 100644
index 8d20b27..0000000
--- a/sigil/eclipse/search/src/org/apache/felix/sigil/search/index/Index.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.search.index;
-
-import java.lang.ref.SoftReference;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-import java.util.regex.Pattern;
-
-import org.apache.bcel.classfile.JavaClass;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.search.ISearchResult;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.osgi.framework.Version;
-
-public class Index
-{
-    private HashMap<String, ClassData> primary = new HashMap<String, ClassData>();
-    private HashMap<IBundleRepository, HashSet<String>> secondary = new HashMap<IBundleRepository, HashSet<String>>();
-
-    private final ReadWriteLock lock = new ReentrantReadWriteLock();
-
-    static class ClassData
-    {
-        HashMap<IBundleRepository, Set<ISearchResult>> provided = new HashMap<IBundleRepository, Set<ISearchResult>>();
-
-        void add(IBundleRepository rep, ISearchResult export)
-        {
-            Set<ISearchResult> exports = provided.get(rep);
-
-            if (exports == null)
-            {
-                exports = new HashSet<ISearchResult>();
-                provided.put(rep, exports);
-            }
-
-            exports.add(export);
-        }
-
-        List<ISearchResult> getResults()
-        {
-            LinkedList<ISearchResult> exports = new LinkedList<ISearchResult>();
-            for (Set<ISearchResult> p : provided.values())
-            {
-                exports.addAll(p);
-            }
-            return exports;
-        }
-
-        void remove(IBundleRepository rep)
-        {
-            provided.remove(rep);
-        }
-
-        boolean isEmpty()
-        {
-            return provided.isEmpty();
-        }
-    }
-
-    static class SearchResult implements ISearchResult
-    {
-        private final String className;
-        private final String packageName;
-        private final IBundleRepository rep;
-        private final String bundleSymbolicName;
-        private final Version version;
-        private final boolean exported;
-
-        private SoftReference<ISigilBundle> bundleReference;
-        private SoftReference<IPackageExport> exportReference;
-
-        public SearchResult(String className, IBundleRepository rep, ISigilBundle bundle, String packageName, boolean exported)
-        {
-            this.className = className;
-            this.rep = rep;
-            this.exported = exported;
-            this.bundleSymbolicName = bundle.getBundleInfo().getSymbolicName();
-            this.version = bundle.getVersion();
-            this.packageName = packageName;
-        }
-
-        public String getClassName()
-        {
-            return className;
-        }
-
-        public String getPackageName()
-        {
-            return packageName;
-        }
-
-        public IPackageExport getExport()
-        {
-            IPackageExport ipe = null;
-            if (exported)
-            {
-                ipe = exportReference == null ? null : exportReference.get();
-                if (ipe == null)
-                {
-                    ipe = getProvider().findExport(packageName);
-                    exportReference = new SoftReference<IPackageExport>(ipe);
-                }
-            }
-            return ipe;
-        }
-
-        public ISigilBundle getProvider()
-        {
-            ISigilBundle b = bundleReference == null ? null : bundleReference.get();
-            if (b == null)
-            {
-                IRequiredBundle rb = ModelElementFactory.getInstance().newModelElement(
-                    IRequiredBundle.class);
-                rb.setSymbolicName(bundleSymbolicName);
-                VersionRange versions = new VersionRange(false, version, version, false);
-                rb.setVersions(versions);
-                b = rep.findProvider(rb, 0);
-                bundleReference = new SoftReference<ISigilBundle>(b);
-            }
-            return b;
-        }
-
-    }
-
-    public void addEntry(JavaClass c, IBundleRepository rep, ISigilBundle bundle,
-        boolean exported)
-    {
-        addEntry(c.getClassName(), rep, bundle, c.getPackageName(), exported);
-    }
-
-    public void addEntry(ICompilationUnit unit, IBundleRepository rep,
-        ISigilBundle bundle, boolean exported)
-    {
-        String name = unit.getElementName();
-        if (name.endsWith(".java"))
-        {
-            name = name.substring(0, name.length() - 5);
-        }
-        IPackageFragment p = (IPackageFragment) unit.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
-        addEntry(p.getElementName() + "." + name, rep, bundle, p.getElementName(),
-            exported);
-    }
-
-    private void addEntry(String className, IBundleRepository rep, ISigilBundle bundle,
-        String packageName, boolean exported)
-    {
-        List<String> keys = genKeys(className);
-        lock.writeLock().lock();
-        try
-        {
-            for (String key : keys)
-            {
-                ClassData data = primary.get(key);
-
-                if (data == null)
-                {
-                    data = new ClassData();
-                    primary.put(key, data);
-                }
-
-                SearchResult result = new SearchResult(className, rep, bundle,
-                    packageName, exported);
-                data.add(rep, result);
-            }
-
-            HashSet<String> all = secondary.get(rep);
-            if (all == null)
-            {
-                all = new HashSet<String>();
-                secondary.put(rep, all);
-            }
-            all.addAll(keys);
-        }
-        finally
-        {
-            lock.writeLock().unlock();
-        }
-    }
-
-    public List<ISearchResult> findProviders(String className, IProgressMonitor monitor)
-    {
-        lock.readLock().lock();
-        try
-        {
-            ClassData data = primary.get(className);
-            return data == null ? Collections.<ISearchResult> emptyList()
-                : data.getResults();
-        }
-        finally
-        {
-            lock.readLock().unlock();
-        }
-    }
-
-    public List<ISearchResult> findProviders(Pattern className, IProgressMonitor monitor)
-    {
-        lock.readLock().lock();
-        try
-        {
-            ClassData data = primary.get(className);
-            return data == null ? Collections.<ISearchResult> emptyList()
-                : data.getResults();
-        }
-        finally
-        {
-            lock.readLock().unlock();
-        }
-    }
-
-    public void delete(IBundleRepository rep)
-    {
-        lock.writeLock().lock();
-        try
-        {
-            Set<String> keys = secondary.remove(rep);
-            if (keys != null)
-            {
-                for (String key : keys)
-                {
-                    ClassData data = primary.get(key);
-                    data.remove(rep);
-                    if (data.isEmpty())
-                    {
-                        primary.remove(key);
-                    }
-                }
-            }
-        }
-        finally
-        {
-            lock.writeLock().unlock();
-        }
-    }
-
-    private List<String> genKeys(String className)
-    {
-        LinkedList<String> keys = new LinkedList<String>();
-        keys.add(className);
-        int i = className.lastIndexOf('.');
-        if (i != -1)
-        {
-            String name = className.substring(i + 1);
-            keys.add(name);
-        }
-        return keys;
-    }
-
-}
diff --git a/sigil/eclipse/sigil-defaults.properties b/sigil/eclipse/sigil-defaults.properties
deleted file mode 100644
index bfc9d0d..0000000
--- a/sigil/eclipse/sigil-defaults.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-# sigil common default properties
--defaults: ${BLDCOMMON:-../bldcommon}/sigil-defaults.properties
diff --git a/sigil/eclipse/ui/.classpath b/sigil/eclipse/ui/.classpath
deleted file mode 100644
index fce9fdb..0000000
--- a/sigil/eclipse/ui/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="lib" path="lib/org.eclipse.swt.carbon.macosx.jar"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/eclipse/ui/.project b/sigil/eclipse/ui/.project
deleted file mode 100644
index 35b56c2..0000000
--- a/sigil/eclipse/ui/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.eclipse.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/eclipse/ui/.settings/org.eclipse.jdt.core.prefs b/sigil/eclipse/ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 922196c..0000000
--- a/sigil/eclipse/ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,258 +0,0 @@
-#Thu Sep 17 16:11:02 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/eclipse/ui/.settings/org.eclipse.jdt.ui.prefs b/sigil/eclipse/ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index cd2a7ac..0000000
--- a/sigil/eclipse/ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:11:02 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/eclipse/ui/DEPENDENCIES b/sigil/eclipse/ui/DEPENDENCIES
deleted file mode 100644
index a3ed667..0000000
--- a/sigil/eclipse/ui/DEPENDENCIES
+++ /dev/null
@@ -1,26 +0,0 @@
-Apache Felix Sigil Eclipse UI
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed by the The Eclipse Foundation
-(http://www.eclipse.org)
-Copyright © 2010 The Eclipse Foundation. All Rights Reserved.
-Licensed under the Eclipse Public License - v 1.0.
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
-- Eclipse Public License - v 1.0
diff --git a/sigil/eclipse/ui/NOTICE b/sigil/eclipse/ui/NOTICE
deleted file mode 100644
index 6328fd0..0000000
--- a/sigil/eclipse/ui/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Eclipse UI
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/eclipse/ui/build.xml b/sigil/eclipse/ui/build.xml
deleted file mode 100644
index 6822885..0000000
--- a/sigil/eclipse/ui/build.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="eclipse.ui" default="build"
-	  xmlns:ivy="antlib:org.apache.ivy.ant">
-  <import file="../build.xml"/>
-  <target name="init">
-    <ivy:retrieve organisation="org.eclipse" module="org.eclipse.swt.carbon.macosx" revision="3.4.1.v3452b" inline="true" pattern="lib/[artifact].[ext]" transitive="false"/>
-  </target>
-</project>
diff --git a/sigil/eclipse/ui/icons/active.gif b/sigil/eclipse/ui/icons/active.gif
deleted file mode 100644
index fb90cb1..0000000
--- a/sigil/eclipse/ui/icons/active.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/bundle-graph.gif b/sigil/eclipse/ui/icons/bundle-graph.gif
deleted file mode 100644
index d4c878b..0000000
--- a/sigil/eclipse/ui/icons/bundle-graph.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/bundle-refresh.gif b/sigil/eclipse/ui/icons/bundle-refresh.gif
deleted file mode 100644
index 705222b..0000000
--- a/sigil/eclipse/ui/icons/bundle-refresh.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/bundle.gif b/sigil/eclipse/ui/icons/bundle.gif
deleted file mode 100644
index fb90cb1..0000000
--- a/sigil/eclipse/ui/icons/bundle.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/export-package.gif b/sigil/eclipse/ui/icons/export-package.gif
deleted file mode 100644
index 4fc70c3..0000000
--- a/sigil/eclipse/ui/icons/export-package.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/fragment.gif b/sigil/eclipse/ui/icons/fragment.gif
deleted file mode 100644
index a0ab0d1..0000000
--- a/sigil/eclipse/ui/icons/fragment.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/host.gif b/sigil/eclipse/ui/icons/host.gif
deleted file mode 100644
index 14b0dd3..0000000
--- a/sigil/eclipse/ui/icons/host.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/import-package-error.gif b/sigil/eclipse/ui/icons/import-package-error.gif
deleted file mode 100644
index 57a64be..0000000
--- a/sigil/eclipse/ui/icons/import-package-error.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/import-package-optional-error.gif b/sigil/eclipse/ui/icons/import-package-optional-error.gif
deleted file mode 100644
index dcd9507..0000000
--- a/sigil/eclipse/ui/icons/import-package-optional-error.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/import-package-optional.gif b/sigil/eclipse/ui/icons/import-package-optional.gif
deleted file mode 100644
index 2ab3ff8..0000000
--- a/sigil/eclipse/ui/icons/import-package-optional.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/import-package.gif b/sigil/eclipse/ui/icons/import-package.gif
deleted file mode 100644
index 30a5199..0000000
--- a/sigil/eclipse/ui/icons/import-package.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/importing-bundle.gif b/sigil/eclipse/ui/icons/importing-bundle.gif
deleted file mode 100644
index 430252c..0000000
--- a/sigil/eclipse/ui/icons/importing-bundle.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/installed.gif b/sigil/eclipse/ui/icons/installed.gif
deleted file mode 100644
index 5e43705..0000000
--- a/sigil/eclipse/ui/icons/installed.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/inuse.gif b/sigil/eclipse/ui/icons/inuse.gif
deleted file mode 100644
index 4cbdf38..0000000
--- a/sigil/eclipse/ui/icons/inuse.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/logo16x16.gif b/sigil/eclipse/ui/icons/logo16x16.gif
deleted file mode 100644
index 0c344d8..0000000
--- a/sigil/eclipse/ui/icons/logo16x16.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/logo32x32.gif b/sigil/eclipse/ui/icons/logo32x32.gif
deleted file mode 100644
index 1b4d9f2..0000000
--- a/sigil/eclipse/ui/icons/logo32x32.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/logo64x64.gif b/sigil/eclipse/ui/icons/logo64x64.gif
deleted file mode 100644
index cb4ac5d..0000000
--- a/sigil/eclipse/ui/icons/logo64x64.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/mini-logo.gif b/sigil/eclipse/ui/icons/mini-logo.gif
deleted file mode 100644
index f4151fb..0000000
--- a/sigil/eclipse/ui/icons/mini-logo.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/module.gif b/sigil/eclipse/ui/icons/module.gif
deleted file mode 100644
index 88edb7b..0000000
--- a/sigil/eclipse/ui/icons/module.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/package.gif b/sigil/eclipse/ui/icons/package.gif
deleted file mode 100644
index d281d2c..0000000
--- a/sigil/eclipse/ui/icons/package.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/property.gif b/sigil/eclipse/ui/icons/property.gif
deleted file mode 100644
index 270bdac..0000000
--- a/sigil/eclipse/ui/icons/property.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/registered.gif b/sigil/eclipse/ui/icons/registered.gif
deleted file mode 100644
index e41f6ce..0000000
--- a/sigil/eclipse/ui/icons/registered.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/repository.gif b/sigil/eclipse/ui/icons/repository.gif
deleted file mode 100644
index 2d1f8be..0000000
--- a/sigil/eclipse/ui/icons/repository.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/require-bundle-error.gif b/sigil/eclipse/ui/icons/require-bundle-error.gif
deleted file mode 100644
index b6d6e31..0000000
--- a/sigil/eclipse/ui/icons/require-bundle-error.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/require-bundle-optional-error.gif b/sigil/eclipse/ui/icons/require-bundle-optional-error.gif
deleted file mode 100644
index ec0adbd..0000000
--- a/sigil/eclipse/ui/icons/require-bundle-optional-error.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/require-bundle-optional.gif b/sigil/eclipse/ui/icons/require-bundle-optional.gif
deleted file mode 100644
index d1fec08..0000000
--- a/sigil/eclipse/ui/icons/require-bundle-optional.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/require-bundle.gif b/sigil/eclipse/ui/icons/require-bundle.gif
deleted file mode 100644
index 3d2d8dc..0000000
--- a/sigil/eclipse/ui/icons/require-bundle.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/resolved.gif b/sigil/eclipse/ui/icons/resolved.gif
deleted file mode 100644
index d3ace48..0000000
--- a/sigil/eclipse/ui/icons/resolved.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/run.gif b/sigil/eclipse/ui/icons/run.gif
deleted file mode 100644
index 442c299..0000000
--- a/sigil/eclipse/ui/icons/run.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/test.gif b/sigil/eclipse/ui/icons/test.gif
deleted file mode 100644
index d91cc67..0000000
--- a/sigil/eclipse/ui/icons/test.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/icons/unknown.gif b/sigil/eclipse/ui/icons/unknown.gif
deleted file mode 100644
index 62903bf..0000000
--- a/sigil/eclipse/ui/icons/unknown.gif
+++ /dev/null
Binary files differ
diff --git a/sigil/eclipse/ui/ivy.xml b/sigil/eclipse/ui/ivy.xml
deleted file mode 100644
index 10a4d8b..0000000
--- a/sigil/eclipse/ui/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.eclipse.ui"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.eclipse.ui" />
-   </publications>
-</ivy-module>
diff --git a/sigil/eclipse/ui/plugin.properties b/sigil/eclipse/ui/plugin.properties
deleted file mode 100644
index 4b96436..0000000
--- a/sigil/eclipse/ui/plugin.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-repositoriesPrefPage=Repositories
-newtonRepoPrefs=Newton Repository
-librariesPrefsPage=OSGi Libraries
-commandConvertProject=Convert Project To Sigil Project
-commandRefreshClasspath=Refresh bundle classpath
-RenameActivatorPackageParticipant.name=Rename Activator Package Participant
-RenameActivatorParticipant.name=Rename Activator Participant
-RenamePackageParticipant.name=Rename Package Participant
-MoveActivatorParticipant.name=Move Activator Participant
-MovePackageParticipant.name=Move Package Participant
\ No newline at end of file
diff --git a/sigil/eclipse/ui/plugin.xml b/sigil/eclipse/ui/plugin.xml
deleted file mode 100644
index 8ca3bb2..0000000
--- a/sigil/eclipse/ui/plugin.xml
+++ /dev/null
@@ -1,334 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<?eclipse version="3.2"?>
-<plugin>
-   <extension-point id="org.apache.felix.sigil.ui.repositorywizard" name="Repository Wizard" schema="schema/org.apache.felix.sigil.ui.repositorywizard.exsd"/>
-      <extension
-         point="org.eclipse.ui.startup">
-      <startup class="org.apache.felix.sigil.eclipse.ui.internal.startup.SigilStartup"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <category
-            id="org.apache.felix.sigil.newWizardCategory"
-            name="Sigil"/>
-      <wizard
-            category="org.apache.felix.sigil.newWizardCategory"
-            class="org.apache.felix.sigil.eclipse.ui.wizard.project.SigilProjectWizard"
-            finalPerspective="org.apache.felix.sigil.ui.perspective"
-            icon="icons/logo16x16.gif"
-            id="org.apache.felix.sigil.editors.newProjectWizard"
-            name="Sigil Project"
-            project="true"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            class="org.apache.felix.sigil.eclipse.ui.internal.preferences.SigilPreferencePage"
-            id="org.apache.felix.sigil.ui.preferences.SigilPreferencePage"
-            name="Sigil"/>
-      <!--page
-            category="org.apache.felix.sigil.ui.preferences.SigilPreferencePage"
-            class="org.apache.felix.sigil.ui.preferences.LibraryPreferencePage"
-            id="org.apache.felix.sigil.ui.libraryPreferences"
-            name="%librariesPrefsPage" >
-      </page-->
-      <page
-            category="org.apache.felix.sigil.ui.preferences.SigilPreferencePage"
-            class="org.apache.felix.sigil.eclipse.ui.internal.preferences.repository.RepositoriesPreferencePage"
-            id="org.apache.felix.sigil.ui.preferences.repositoriesPreferencePage"
-            name="%repositoriesPrefPage">
-      </page>
-      <page
-            category="org.apache.felix.sigil.ui.preferences.SigilPreferencePage"
-            class="org.apache.felix.sigil.eclipse.ui.internal.preferences.ExcludedResourcesPrefsPage"
-            id="org.apache.felix.sigil.ui.preferences.excludedResources"
-            name="Excluded Resources">
-      </page>
-      <page
-            category="org.apache.felix.sigil.ui.preferences.SigilPreferencePage"
-            class="org.apache.felix.sigil.eclipse.ui.internal.preferences.VersionsPreferencePage"
-            id="org.apache.felix.sigil.ui.preferences.VersionsPreferencePage"
-            name="Version Handling">
-      </page>
-      <page
-            category="org.apache.felix.sigil.ui.preferences.SigilPreferencePage"
-            class="org.apache.felix.sigil.eclipse.ui.internal.preferences.installs.OSGiInstallsPreferencePage"
-            id="org.apache.felix.sigil.ui.preferences.osgiInstalls"
-            name="OSGi Installs">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            class="org.apache.felix.sigil.eclipse.ui.internal.editors.project.SigilProjectEditorPart"
-            default="true"
-            filenames="sigil.properties"
-            icon="icons/logo16x16.gif"
-            id="org.apache.felix.sigil.editors.SigilProjectEditor"
-            name="Sigil Project Editor"/>
-   </extension>
-   <extension
-         point="org.eclipse.jdt.core.classpathContainerInitializer">
-      <classpathContainerInitializer
-            class="org.apache.felix.sigil.eclipse.ui.internal.classpath.SigilClasspathContainerInitializer"
-            id="org.apache.felix.sigil.classpathContainer"/>
-   </extension>
-   <extension
-         point="org.eclipse.jdt.ui.classpathContainerPage">
-      <classpathContainerPage
-            class="org.apache.felix.sigil.eclipse.ui.internal.classpath.SigilLibraryPage"        id="org.apache.felix.sigil.classpathContainer"
-            name="Sigil Library"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            class="org.apache.felix.sigil.eclipse.ui.internal.perspective.SigilPerspectiveFactory"
-            icon="icons/logo16x16.gif"
-            id="org.apache.felix.sigil.ui.perspective"
-            name="Sigil">
-      </perspective>
-   </extension>
-   <extension
-         point="org.eclipse.jdt.ui.quickFixProcessors">
-      <quickFixProcessor
-            class="org.apache.felix.sigil.eclipse.ui.internal.quickfix.ImportQuickFixProcessor"
-            id="org.apache.felix.sigil.ui.importQuickFixProcessor">
-      </quickFixProcessor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            allowMultiple="false"
-            category="org.apache.felix.sigil.ui.views"
-            class="org.apache.felix.sigil.eclipse.ui.internal.views.resolution.BundleResolverView"
-            icon="icons/bundle-graph.gif"
-            id="org.apache.felix.sigil.ui.bundleDependencyView"
-            name="Bundle Dependency View"
-            restorable="true">
-      </view>
-      <view
-            allowMultiple="false"
-            category="org.apache.felix.sigil.ui.views"
-            class="org.apache.felix.sigil.eclipse.ui.internal.views.RepositoryViewPart"
-            icon="icons/repository.gif"
-            id="org.apache.felix.sigil.ui.repositoryBrowser"
-            name="Repository Browser"
-            restorable="true">
-      </view>
-      <category
-            id="org.apache.felix.sigil.ui.views"
-            name="Sigil">
-      </category>
-   </extension>
-   <extension
-         point="org.apache.felix.sigil.ui.repositorywizard">
-      <wizard
-            class="org.apache.felix.sigil.eclipse.ui.internal.repository.FileSystemRepositoryWizard"
-            repository="org.apache.felix.sigil.core.file">
-      </wizard>
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="popup:org.eclipse.ui.popup.any">
-         <menu
-               icon="etc/images/newton.png"
-               label="Sigil">
-            <command
-                  commandId="org.apache.felix.sigil.ui.convertproject"
-                  label="Convert Project"
-                  style="push">
-               <visibleWhen
-                     checkEnabled="true">
-               </visibleWhen>
-            </command>
-         </menu>
-         <separator
-               name="org.apache.felix.sigil.ui.separator"
-               visible="true">
-         </separator>
-         <command
-               commandId="org.apache.felix.sigil.ui.refreshclasspath"
-               icon="icons/refreshBundle.png"
-               label="Refresh bundle classpath"
-               style="push">
-               <visibleWhen
-                     checkEnabled="true">
-               </visibleWhen>
-            </command>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            id="org.apache.felix.sigil.ui.convertproject"
-            name="%commandConvertProject">
-      </command>
-      <command
-            id="org.apache.felix.sigil.ui.refreshclasspath"
-            name="%commandRefreshClasspath">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commandImages">
-      <image
-            commandId="org.apache.felix.sigil.ui.convertproject"
-            icon="icons/logo16x16.gif">
-      </image>
-      <image
-            commandId="org.apache.felix.sigil.ui.refreshclasspath"
-            icon="icons/repository.gif">
-      </image>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            class="org.apache.felix.sigil.eclipse.ui.internal.handlers.project.ConvertProjectHandler"
-            commandId="org.apache.felix.sigil.ui.convertproject">
-         <activeWhen>
-            <with
-                  variable="selection">
-               <iterate
-                     ifEmpty="false"
-                     operator="and">
-					<instanceof
-	                           value="org.eclipse.core.resources.IProject">
-	                </instanceof>
-		            <test
-						property="org.apache.felix.sigil.isSigilProject"
-						value="false">
-					</test>
-               </iterate>
-            </with>
-         </activeWhen>
-      </handler>      
-      <handler
-            class="org.apache.felix.sigil.eclipse.ui.internal.handlers.project.RefreshSigilClasspathHandler"
-            commandId="org.apache.felix.sigil.ui.refreshclasspath">
-         <activeWhen>
-            <with
-                  variable="selection">
-               <iterate
-                     ifEmpty="false"
-                     operator="and">
-					<instanceof
-	                           value="org.eclipse.core.resources.IProject">
-	                </instanceof>
-		            <test
-						property="org.apache.felix.sigil.isSigilProject"
-						value="true">
-					</test>
-               </iterate>
-            </with>
-         </activeWhen>
-      </handler>      
-   </extension>
-   <extension point="org.eclipse.ltk.core.refactoring.renameParticipants">
-     <renameParticipant
-        id="org.apache.felix.sigil.renamePackageParticipant"
-        name="%RenamePackageParticipant.name" 
-        class="org.apache.felix.sigil.eclipse.ui.internal.refactor.RenamePackageParticipant">
-       <enablement>
-         <with variable="affectedNatures">
-           <iterate operator="or">
-             <equals value="org.apache.felix.sigil.sigilnature"/>
-           </iterate>
-         </with>
-         <with variable="element">
-           <instanceof value="org.eclipse.jdt.core.IPackageFragment"/>
-         </with>
-       </enablement>
-     </renameParticipant>
-     <renameParticipant
-        id="org.apache.felix.sigil.renameActivatorParticipant"
-        name="%RenameActivatorParticipant.name" 
-        class="org.apache.felix.sigil.eclipse.ui.internal.refactor.RenameActivatorParticipant">
-       <enablement>
-         <with variable="affectedNatures">
-           <iterate operator="or">
-             <equals value="org.apache.felix.sigil.sigilnature"/>
-           </iterate>
-         </with>
-         <with variable="element">
-           <instanceof value="org.eclipse.jdt.core.ICompilationUnit"/>
-         </with>
-       </enablement>
-     </renameParticipant>
-     <renameParticipant
-        id="org.apache.felix.sigil.movePackageParticipant"
-        name="%RenameActivatorPackageParticipant.name" 
-        class="org.apache.felix.sigil.eclipse.ui.internal.refactor.RenameActivatorPackageParticipant">
-       <enablement>
-         <with variable="affectedNatures">
-           <iterate operator="or">
-             <equals value="org.apache.felix.sigil.sigilnature"/>
-           </iterate>
-         </with>
-         <with variable="element">
-           <instanceof value="org.eclipse.jdt.core.IPackageFragment"/>
-         </with>
-       </enablement>
-     </renameParticipant>
-   </extension>  
-   <extension point="org.eclipse.ltk.core.refactoring.moveParticipants">
-     <moveParticipant
-        id="org.apache.felix.sigil.movePackageParticipant"
-        name="%MovePackageParticipant.name" 
-        class="org.apache.felix.sigil.eclipse.ui.internal.refactor.MovePackageParticipant">
-       <enablement>
-         <with variable="affectedNatures">
-           <iterate operator="or">
-             <equals value="org.apache.felix.sigil.sigilnature"/>
-           </iterate>
-         </with>
-         <with variable="element">
-           <instanceof value="org.eclipse.jdt.core.IPackageFragment"/>
-         </with>
-       </enablement>
-     </moveParticipant>
-     <moveParticipant
-        id="org.apache.felix.sigil.moveActivatorParticipant"
-        name="%MoveActivatorParticipant.name" 
-        class="org.apache.felix.sigil.eclipse.ui.internal.refactor.MoveActivatorParticipant">
-       <enablement>
-         <with variable="affectedNatures">
-           <iterate operator="or">
-             <equals value="org.apache.felix.sigil.sigilnature"/>
-           </iterate>
-         </with>
-         <with variable="element">
-           <instanceof value="org.eclipse.jdt.core.ICompilationUnit"/>
-         </with>
-       </enablement>
-     </moveParticipant>
-   </extension>  
-   
-   <!--extension point="org.eclipse.ltk.ui.refactoring.changePreviewViewers">
-      <changePreviewViewer
-            class="org.apache.felix.sigil.eclipse.ui.internal.refactor.ExportChangePreviewViewer"
-            id="org.apache.felix.sigil.eclipse.ui.refactor.exportChangePreviewViewer">
-         <enablement>
-            <instanceof value="org.apache.felix.sigil.eclipse.ui.internal.refactor.ExportPackageChange"/>
-         </enablement>
-      </changePreviewViewer>
-   </extension-->
-</plugin>
diff --git a/sigil/eclipse/ui/resources/org/cauldron/sigil/ui/SigilUI.properties b/sigil/eclipse/ui/resources/org/cauldron/sigil/ui/SigilUI.properties
deleted file mode 100644
index e69de29..0000000
--- a/sigil/eclipse/ui/resources/org/cauldron/sigil/ui/SigilUI.properties
+++ /dev/null
diff --git a/sigil/eclipse/ui/schema/org.apache.felix.sigil.ui.repositorywizard.exsd b/sigil/eclipse/ui/schema/org.apache.felix.sigil.ui.repositorywizard.exsd
deleted file mode 100644
index 58869ac..0000000
--- a/sigil/eclipse/ui/schema/org.apache.felix.sigil.ui.repositorywizard.exsd
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.apache.felix.sigil.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.apache.felix.sigil.eclipse.ui" id="org.apache.felix.sigil.eclipse.ui.repositorywizard" name="Repository Wizard"/>
-      </appinfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="wizard"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizard">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.apache.felix.sigil.ui.eclipse.ui.wizard.repository.RepositoryWizard:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="repository" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/sigil/eclipse/ui/sigil.properties b/sigil/eclipse/ui/sigil.properties
deleted file mode 100644
index 7de9304..0000000
--- a/sigil/eclipse/ui/sigil.properties
+++ /dev/null
@@ -1,118 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--activator: org.apache.felix.sigil.eclipse.ui.SigilUI
-
--singleton: true
-
--bundles: \
-	org.apache.felix.sigil.eclipse.ui, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-	icons, \
-	plugin.properties, \
-	plugin.xml, \
-	schema, \
-	schema/org.apache.felix.sigil.ui.repositorywizard.exsd, \
-
--sourcedirs: \
-	src, \
-
--exports: \
-	org.apache.felix.sigil.eclipse.ui, \
-	org.apache.felix.sigil.eclipse.ui.actions, \
-	org.apache.felix.sigil.eclipse.ui.util, \
-	org.apache.felix.sigil.eclipse.ui.wizard.project, \
-	org.apache.felix.sigil.eclipse.ui.wizard.repository, \
-
--imports: \
-	org.apache.felix.sigil.common.config, \
-	org.apache.felix.sigil.common.model, \
-	org.apache.felix.sigil.common.model.eclipse, \
-	org.apache.felix.sigil.common.model.osgi, \
-	org.apache.felix.sigil.common.osgi, \
-	org.apache.felix.sigil.common.repository, \
-	org.apache.felix.sigil.eclipse, \
-	org.apache.felix.sigil.eclipse.install, \
-	org.apache.felix.sigil.eclipse.job, \
-	org.apache.felix.sigil.eclipse.model.project, \
-	org.apache.felix.sigil.eclipse.model.repository, \
-	org.apache.felix.sigil.eclipse.model.util, \
-	org.apache.felix.sigil.eclipse.preferences, \
-	org.apache.felix.sigil.eclipse.repository, \
-	org.apache.felix.sigil.eclipse.ui, \
-	org.apache.felix.sigil.eclipse.ui.actions, \
-	org.apache.felix.sigil.eclipse.ui.util, \
-	org.apache.felix.sigil.eclipse.ui.wizard.project, \
-	org.apache.felix.sigil.eclipse.ui.wizard.repository, \
-	org.apache.felix.sigil.search, \
-	org.apache.felix.sigil.utils, \
-	org.eclipse.core.commands, \
-	org.eclipse.core.commands.common, \
-	org.eclipse.core.resources, \
-	org.eclipse.core.resources.mapping, \
-	org.eclipse.debug.core, \
-	org.eclipse.debug.ui, \
-	org.eclipse.draw2d, \
-	org.eclipse.jdt.core, \
-	org.eclipse.jdt.core.compiler, \
-	org.eclipse.jdt.core.dom, \
-	org.eclipse.jdt.core.dom.rewrite, \
-	org.eclipse.jdt.internal.corext.dom, \
-	org.eclipse.jdt.internal.corext.util, \
-	org.eclipse.jdt.internal.ui, \
-	org.eclipse.jdt.internal.ui.propertiesfileeditor, \
-	org.eclipse.jdt.ui, \
-	org.eclipse.jdt.ui.text, \
-	org.eclipse.jdt.ui.text.java, \
-	org.eclipse.jdt.ui.wizards, \
-	org.eclipse.jface.action, \
-	org.eclipse.jface.dialogs, \
-	org.eclipse.jface.fieldassist, \
-	org.eclipse.jface.layout, \
-	org.eclipse.jface.operation, \
-	org.eclipse.jface.preference, \
-	org.eclipse.jface.resource, \
-	org.eclipse.jface.util, \
-	org.eclipse.jface.viewers, \
-	org.eclipse.jface.window, \
-	org.eclipse.jface.wizard, \
-	org.eclipse.ltk.core.refactoring, \
-	org.eclipse.ltk.core.refactoring.participants, \
-	org.eclipse.ltk.ui.refactoring, \
-	org.eclipse.ui.editors.text, \
-	org.eclipse.ui.forms, \
-	org.eclipse.ui.forms.editor, \
-	org.eclipse.ui.forms.events, \
-	org.eclipse.ui.forms.widgets, \
-	org.eclipse.ui.plugin, \
-	org.eclipse.ui.progress, \
-	org.eclipse.ui.texteditor, \
-	org.eclipse.zest.core.viewers, \
-	org.eclipse.zest.core.widgets, \
-	org.eclipse.zest.layouts, \
-	org.eclipse.zest.layouts.algorithms, \
-	org.osgi.framework, \
-	org.osgi.service.prefs, \
-
--requires: \
-	org.eclipse.core.jobs;version=3.4.1, \
-	org.eclipse.core.runtime;version=3.4.0, \
-	org.eclipse.equinox.common;version=3.4.0, \
-	org.eclipse.equinox.registry;version=3.4.0, \
-	org.eclipse.jface.text;version=3.4.2, \
-	org.eclipse.swt;version=3.4.2, \
-	org.eclipse.text;version=3.4.0, \
-	org.eclipse.ui.ide;version=3.4.2, \
-	org.eclipse.ui.workbench;version=3.4.1, \
-	org.eclipse.ui.workbench.texteditor;version=3.4.1, \
-
-header;Bundle-Localization: plugin
-
-header;Bundle-ActivationPolicy: lazy
-
-option;addMissingImports: false
-
-# end
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/SigilUI.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/SigilUI.java
deleted file mode 100644
index a34c71b..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/SigilUI.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui;
-
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Locale;
-import java.util.ResourceBundle;
-import java.util.concurrent.Callable;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class SigilUI extends AbstractUIPlugin
-{
-
-    // The plug-in ID
-    public static final String PLUGIN_ID = "org.apache.felix.sigil.eclipse.ui";
-
-    public static final String REPOSITORY_WIZARD_EXTENSION_POINT_ID = "org.apache.felix.sigil.ui.repositorywizard";
-
-    public static final String PREF_NOPROMPT_INSTALL_COMPOSITE_WITH_ERRORS = "nopromptInstallCompositeError";
-    public static final String PREF_INSTALL_COMPOSITE_WITH_ERRORS_ANSWER = "answerInstallCompositeError";
-
-    public static final String ID_REPOSITORY_VIEW = "org.apache.felix.sigil.ui.repositoryBrowser";
-    public static final String ID_DEPENDENCY_VIEW = "org.apache.felix.sigil.ui.bundleDependencyView";
-
-    public static final String WORKSPACE_REPOSITORY_ID = "org.apache.felix.sigil.core.workspaceprovider";
-
-    // The shared instance
-    private static SigilUI plugin;
-
-    /**
-     * The constructor
-     */
-    public SigilUI()
-    {
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     */
-    public void start(BundleContext context) throws Exception
-    {
-        super.start(context);
-        SigilCore.getDefault();
-        plugin = this;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     */
-    public void stop(BundleContext context) throws Exception
-    {
-        plugin = null;
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static SigilUI getDefault()
-    {
-        return plugin;
-    }
-
-    public static ResourceBundle getResourceBundle()
-    {
-        return ResourceBundle.getBundle("resources." + SigilUI.class.getName(),
-            Locale.getDefault(), SigilUI.class.getClassLoader());
-    }
-
-    public static void runWorkspaceOperation(IRunnableWithProgress op, Shell shell)
-    {
-        if (shell == null)
-        {
-            shell = getActiveWorkbenchShell();
-        }
-        try
-        {
-            new ProgressMonitorDialog(shell).run(true, true, op);
-        }
-        catch (InvocationTargetException e)
-        {
-            SigilCore.error("Workspace operation failed", e);
-        }
-        catch (InterruptedException e1)
-        {
-            SigilCore.log("Workspace operation interrupted");
-        }
-    }
-
-    public static void runWorkspaceOperationSync(IRunnableWithProgress op, Shell shell) throws CoreException
-    {
-        if (shell == null)
-        {
-            shell = getActiveWorkbenchShell();
-        }
-        try
-        {
-            new ProgressMonitorDialog(shell).run(false, true, op);
-        }
-        catch (InvocationTargetException e)
-        {
-            if (e.getCause() instanceof CoreException) {
-                throw (CoreException) e.getCause();
-            }
-            else {
-                throw SigilCore.newCoreException("Failed to execute task", e.getCause());
-            }
-        }
-        catch (InterruptedException e1)
-        {
-            SigilCore.log("Workspace operation interrupted");
-        }
-    }
-
-    public static void runWorkspaceOperationSync(IRunnableWithProgress op) throws CoreException
-    {
-        try
-        {
-            PlatformUI.getWorkbench().getActiveWorkbenchWindow().run(false, true, op);
-        }
-        catch (InvocationTargetException e)
-        {
-            if (e.getCause() instanceof CoreException) {
-                throw (CoreException) e.getCause();
-            }
-            else {
-                throw SigilCore.newCoreException("Failed to execute task", e.getCause());
-            }
-        }
-        catch (InterruptedException e1)
-        {
-            SigilCore.log("Workspace operation interrupted");
-        }
-    }
-    
-    public static IWorkbenchWindow getActiveWorkbenchWindow()
-    {
-        return getDefault().getWorkbench().getActiveWorkbenchWindow();
-    }
-
-    public static Shell getActiveWorkbenchShell()
-    {
-        final Shell[] shell = new Shell[1];
-        runInUISync(new Runnable()
-        {
-            public void run()
-            {
-                shell[0] = getActiveDisplay().getActiveShell();
-            }
-        });
-        return shell[0];
-    }
-
-    public static Display getActiveDisplay()
-    {
-        Display d = Display.getCurrent();
-
-        if (d == null)
-        {
-            d = Display.getDefault();
-        }
-
-        return d;
-    }
-
-    public static void runInUI(Runnable runnable)
-    {
-        getActiveDisplay().asyncExec(runnable);
-    }
-
-    @SuppressWarnings("unchecked")
-    public static <T> T runInUISync(final Callable<T> callable) throws Exception
-    {
-        final Object[] result = new Object[1];
-        final Exception[] exception = new Exception[1];
-        runInUISync(new Runnable()
-        {
-            public void run()
-            {
-                try
-                {
-                    result[0] = callable.call();
-                }
-                catch (Exception e)
-                {
-                    exception[0] = e;
-                }
-            }
-
-        });
-        if (exception[0] == null)
-        {
-            return (T) result[0];
-        }
-        else
-        {
-            throw exception[0];
-        }
-    }
-
-    public static void runInUISync(Runnable runnable)
-    {
-        getActiveDisplay().syncExec(runnable);
-    }
-
-    public static Image cacheImage(String path, ClassLoader classLoader)
-    {
-        ImageRegistry registry = SigilUI.getDefault().getImageRegistry();
-
-        Image image = registry.get(path);
-
-        if (image == null)
-        {
-            image = loadImage(path, classLoader);
-            // XXX-FIXME-XXX add null image
-            if (image != null)
-            {
-                registry.put(path, image);
-            }
-        }
-
-        return image;
-    }
-
-    private static Image loadImage(String resource, ClassLoader loader)
-    {
-        InputStream in = loader.getResourceAsStream(resource);
-        if (in != null)
-        {
-            ImageData data = new ImageData(in);
-            return new Image(SigilUI.getActiveDisplay(), data);
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/DisplayAction.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/DisplayAction.java
deleted file mode 100644
index e40b86d..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/DisplayAction.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-public abstract class DisplayAction extends Action
-{
-
-    public DisplayAction()
-    {
-        super();
-    }
-
-    public DisplayAction(String text)
-    {
-        super(text);
-    }
-
-    public DisplayAction(String text, ImageDescriptor image)
-    {
-        super(text, image);
-    }
-
-    public DisplayAction(String text, int style)
-    {
-        super(text, style);
-    }
-
-    protected Display findDisplay()
-    {
-        Display d = Display.getCurrent();
-
-        if (d == null)
-        {
-            d = Display.getDefault();
-        }
-
-        return d;
-    }
-
-    protected void runInUI(final Shell shell, final WorkspaceModifyOperation op)
-    {
-    }
-
-    protected void info(final Shell shell, final String msg)
-    {
-        shell.getDisplay().asyncExec(new Runnable()
-        {
-            public void run()
-            {
-                MessageDialog.openInformation(shell, "Information", msg);
-            }
-        });
-    }
-
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/PruneProjectDependenciesAction.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/PruneProjectDependenciesAction.java
deleted file mode 100644
index 1b44d7d..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/PruneProjectDependenciesAction.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.actions;
-
-import java.util.Collection;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.util.ResourceReviewDialog;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.progress.IProgressService;
-
-public class PruneProjectDependenciesAction extends DisplayAction
-{
-
-    private ISigilProjectModel project;
-
-    public PruneProjectDependenciesAction(ISigilProjectModel project)
-    {
-        this.project = project;
-    }
-
-    @Override
-    public void run()
-    {
-        final Shell shell = findDisplay().getActiveShell();
-
-        Job job = new Job("Resolving imports")
-        {
-
-            @Override
-            protected IStatus run(IProgressMonitor monitor)
-            {
-                Collection<IModelElement> unused = JavaHelper.findUnusedReferences(
-                    project, monitor);
-
-                if (monitor.isCanceled()) return Status.CANCEL_STATUS;
-                
-                if (unused.isEmpty())
-                {
-                    info(shell, "No unused references found");
-                }
-                else
-                {
-                    final ResourceReviewDialog<IModelElement> dialog = new ResourceReviewDialog<IModelElement>(
-                        shell, "Review Unused Imports", unused);
-
-                    shell.getDisplay().asyncExec(new Runnable()
-                    {
-                        public void run()
-                        {
-                            if (dialog.open() == Window.OK)
-                            {
-                                WorkspaceModifyOperation op = new WorkspaceModifyOperation()
-                                {
-                                    @Override
-                                    protected void execute(IProgressMonitor monitor)
-                                        throws CoreException
-                                    {
-                                        for (IModelElement e : dialog.getResources())
-                                        {
-                                            if (!project.getBundle().getBundleInfo().removeChild(
-                                                e))
-                                            {
-                                                SigilCore.error("Failed to remove " + e);
-                                            }
-                                        }
-
-                                        project.save(monitor);
-                                    }
-                                };
-
-                                SigilUI.runWorkspaceOperation(op, shell);
-                            }
-                        }
-                    });
-                }
-
-                return Status.OK_STATUS;
-            }
-        };
-
-        job.schedule();
-
-        IProgressService p = PlatformUI.getWorkbench().getProgressService();
-        p.showInDialog(shell, job);
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/RefreshRepositoryAction.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/RefreshRepositoryAction.java
deleted file mode 100644
index 5e241e5..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/RefreshRepositoryAction.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-public class RefreshRepositoryAction extends DisplayAction
-{
-    private final List<IBundleRepository> repositories;
-
-    public RefreshRepositoryAction(IBundleRepository...repositories) {
-        this.repositories = Arrays.asList(repositories);
-        
-    }
-    public RefreshRepositoryAction(IRepositoryModel... model)
-    {
-        super("Refresh repository");
-        ArrayList<IBundleRepository> reps = new ArrayList<IBundleRepository>(model.length);
-        for (IBundleRepository b : SigilCore.getGlobalRepositoryManager().getRepositories())
-        {
-            for (IRepositoryModel m : model)
-            {
-                if (b.getId().equals(m.getId()))
-                {
-                    reps.add(b);
-                }
-            }
-        }
-        this.repositories = reps;
-    }
-
-    @Override
-    public void run()
-    {
-        WorkspaceModifyOperation op = new WorkspaceModifyOperation()
-        {
-            @Override
-            protected void execute(IProgressMonitor monitor) throws CoreException,
-                InvocationTargetException, InterruptedException
-            {
-                if ( !repositories.isEmpty() ) {
-                    for (IBundleRepository rep : repositories ) {
-                        rep.refresh();                        
-                    }
-                    
-                    List<ISigilProjectModel> projects = SigilCore.getRoot().getProjects();
-                    SubMonitor sub = SubMonitor.convert(monitor, projects.size() * 10);
-                    for (ISigilProjectModel p : projects)
-                    {
-                        p.resetClasspath(sub.newChild(10), false);
-                    }
-                }
-            }
-        };
-
-        SigilUI.runWorkspaceOperation(op, null);
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/ResolveProjectDependenciesAction.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/ResolveProjectDependenciesAction.java
deleted file mode 100644
index 6cd4b88..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/ResolveProjectDependenciesAction.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.actions;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.util.ResourceReviewDialog;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.progress.IProgressService;
-
-public class ResolveProjectDependenciesAction extends DisplayAction
-{
-
-    private ISigilProjectModel project;
-    private boolean review;
-
-    public ResolveProjectDependenciesAction(ISigilProjectModel project, boolean review)
-    {
-        this.project = project;
-        this.review = review;
-    }
-
-    public void run()
-    {
-        final Shell shell = findDisplay().getActiveShell();
-
-        Job job = new Job("Resolving dependencies")
-        {
-            @Override
-            protected IStatus run(IProgressMonitor monitor)
-            {
-                monitor.beginTask("", IProgressMonitor.UNKNOWN);
-
-                List<IPackageImport> imports = JavaHelper.findRequiredImports(project,
-                    monitor);
-
-                if (monitor.isCanceled()) {
-                    return Status.CANCEL_STATUS;
-                }
-                
-                if (imports.isEmpty())
-                {
-                    info(shell, "No new dependencies found");
-                }
-                else
-                {
-                    Collections.sort(imports, new Comparator<IPackageImport>()
-                    {
-                        public int compare(IPackageImport o1, IPackageImport o2)
-                        {
-                            int i = o1.getPackageName().compareTo(o2.getPackageName());
-
-                            // shouldn't get more than one import for same package
-                            // but may as well sort if do...
-                            if (i == 0)
-                            {
-                                i = o1.getVersions().getFloor().compareTo(
-                                    o2.getVersions().getFloor());
-                            }
-
-                            return i;
-                        }
-                    });
-
-                    final ResourceReviewDialog<IPackageImport> dialog = new ResourceReviewDialog<IPackageImport>(
-                        shell, "Review New Dependencies", imports);
-                    shell.getDisplay().asyncExec(new Runnable()
-                    {
-                        public void run()
-                        {
-                            if (!review || dialog.open() == Window.OK)
-                            {
-                                WorkspaceModifyOperation op = new WorkspaceModifyOperation()
-                                {
-                                    @Override
-                                    protected void execute(IProgressMonitor monitor)
-                                        throws CoreException
-                                    {
-                                        for (IPackageImport pi : dialog.getResources())
-                                        {
-                                            project.getBundle().getBundleInfo().addImport(
-                                                pi);
-                                        }
-
-                                        project.save(monitor);
-                                    }
-                                };
-
-                                SigilUI.runWorkspaceOperation(op, shell);
-                            }
-                        }
-                    });
-                }
-
-                return Status.OK_STATUS;
-            }
-        };
-
-        job.schedule();
-
-        IProgressService p = PlatformUI.getWorkbench().getProgressService();
-        p.showInDialog(shell, job);
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/classpath/SigilClassPathContainer.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/classpath/SigilClassPathContainer.java
deleted file mode 100644
index baf9cea..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/classpath/SigilClassPathContainer.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.classpath;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.job.ThreadProgressMonitor;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-
-/**
- * @author dave
- *
- */
-public class SigilClassPathContainer implements IClasspathContainer
-{
-
-    private static final String CLASSPATH = "classpath";
-    private static final String EMPTY = "empty";
-
-    private IClasspathEntry[] entries;
-    
-    private final ISigilProjectModel sigil;
-    
-    public SigilClassPathContainer(ISigilProjectModel sigil)
-    {
-        this.sigil = sigil;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jdt.core.IClasspathContainer#getClasspathEntries()
-     */
-    public IClasspathEntry[] getClasspathEntries()
-    {
-        if (entries == null)
-        {
-            buildClassPathEntries();
-        }
-
-        return entries;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jdt.core.IClasspathContainer#getDescription()
-     */
-    public String getDescription()
-    {
-        return "Bundle Context Classpath";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jdt.core.IClasspathContainer#getKind()
-     */
-    public int getKind()
-    {
-        return K_SYSTEM;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jdt.core.IClasspathContainer#getPath()
-     */
-    public IPath getPath()
-    {
-        return new Path(SigilCore.CLASSPATH_CONTAINER_PATH);
-    }
-
-    /**
-     * @return
-     * @throws CoreException 
-     * @throws CoreException 
-     */
-    private void buildClassPathEntries()
-    {
-        try
-        {
-            if (sigil.exists()) {
-                entries = getCachedClassPath(sigil);
-                
-                if ( entries == null ) {
-                    IProgressMonitor monitor = ThreadProgressMonitor.getProgressMonitor();
-                    entries = sigil.findExternalClasspath(monitor).toArray(new IClasspathEntry[0]);
-                    
-                    cacheClassPath(sigil, entries);
-                }
-            }
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to build classpath entries", e);
-        }
-        finally
-        {
-            if (entries == null)
-            {
-                entries = new IClasspathEntry[] {};
-            }
-        }
-    }
-    
-    static IClasspathEntry[] getCachedClassPath(ISigilProjectModel project) {
-        File f = getClassPathDir(project);
-        if ( f == null || !f.exists() ) return null;
-        
-        File[] entries = f.listFiles();
-        if ( entries == null || entries.length == 0 ) return null;
-        
-        ArrayList<IClasspathEntry> list = new ArrayList<IClasspathEntry>(entries.length);
-        for(File entry : entries ) {
-            if ( EMPTY.equals(entry.getName() ) ) {
-                list.clear();
-                break;
-            }
-            else {
-                try
-                {
-                    list.add(readClassPath(project.getJavaModel(), entry));
-                }
-                catch (IOException e)
-                {
-                    SigilCore.warn("Failed to read classpath entry " + entry, e);
-                }
-            }
-        }
-        return list.toArray(new IClasspathEntry[list.size()]);
-    }
-
-    private static File getClassPathDir(ISigilProjectModel project)
-    {
-        IPath loc = project.getProject().getWorkingLocation(SigilUI.PLUGIN_ID);
-        
-        if ( loc == null ) return null;
-        
-        loc = loc.append(CLASSPATH);
-        
-        return new File(loc.toOSString());
-    }
-
-    static void cacheClassPath(ISigilProjectModel project, IClasspathEntry[] entries)
-    {
-        File f = getClassPathDir(project);
-        
-        if ( f == null ) return;
-        
-        if ( !f.exists() ) {
-            if (!f.mkdirs()) {
-                SigilCore.warn("Failed to create temp working directory " + f);
-                return;
-            }
-        }
-        
-        try
-        {
-            if (entries.length == 0)
-            {
-                File empty = new File(f, EMPTY);
-                empty.createNewFile();
-            }
-            else {
-                int i = 0;
-                for(IClasspathEntry e : entries) {
-                    File entry = new File(f, Integer.toString(i++));
-                    writeClassPath(project.getJavaModel(), entry, e);
-                }
-            }
-        }
-        catch (IOException e)
-        {
-            SigilCore.warn("Failed to read write classpath entries", e);
-        }
-    }
-
-    /**
-     * @param sigil
-     */
-    static void flushCachedClassPath(ISigilProjectModel project)
-    {
-        File f = getClassPathDir(project);
-        
-        if ( f == null || !f.exists() ) return;
-        
-        File[] files = f.listFiles();
-        if ( files == null ) return;
-        
-        for (File entry : files) {
-            entry.delete();
-        }
-    }
-    
-    private static IClasspathEntry readClassPath(IJavaProject javaModel, File entry) throws IOException
-    {
-        FileInputStream in = new FileInputStream(entry);
-        
-        try
-        {
-            ByteArrayOutputStream buf = new ByteArrayOutputStream();
-            
-            byte[] b = new byte[1024];
-            
-            for(;;) {
-                int r = in.read(b);
-                if ( r == -1 ) break;
-                buf.write(b, 0, r);
-            }
-            
-            String enc = buf.toString();
-            return javaModel.decodeClasspathEntry(enc);
-        }
-        finally
-        {
-            try
-            {
-                in.close();
-            }
-            catch (IOException e)
-            {
-                SigilCore.warn("Failed to close stream to " + entry, e);
-            }
-        }
-    }
-
-    private static void writeClassPath(IJavaProject javaModel, File file, IClasspathEntry entry) throws IOException 
-    {
-        String enc = javaModel.encodeClasspathEntry(entry);
-        FileOutputStream out = new FileOutputStream(file);
-        try {
-            out.write(enc.getBytes());
-            out.flush();
-        }
-        finally {
-            try
-            {
-                out.close();
-            }
-            catch (IOException e)
-            {
-                SigilCore.warn("Failed to close stream to " + entry, e);
-            }            
-        }
-    }
-    
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/classpath/SigilClasspathContainerInitializer.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/classpath/SigilClasspathContainerInitializer.java
deleted file mode 100644
index 2216efa..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/classpath/SigilClasspathContainerInitializer.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.classpath;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.job.*;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.ClasspathContainerInitializer;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-
-public class SigilClasspathContainerInitializer extends ClasspathContainerInitializer
-{
-
-    @Override
-    public boolean canUpdateClasspathContainer(IPath containerPath, IJavaProject project)
-    {
-        return true;
-    }
-
-    @Override
-    public void requestClasspathContainerUpdate(IPath containerPath,
-        IJavaProject project, IClasspathContainer containerSuggestion)
-        throws CoreException
-    {
-        ISigilProjectModel sigil = SigilCore.create(project.getProject());
-        
-        SigilClassPathContainer.flushCachedClassPath(sigil);
-
-        IClasspathContainer sigilContainer = new SigilClassPathContainer(sigil);
-
-        IJavaProject[] affectedProjects = new IJavaProject[] { project };
-
-        IClasspathContainer[] respectiveContainers = new IClasspathContainer[] { sigilContainer };
-
-        
-        JavaCore.setClasspathContainer(containerPath, affectedProjects,
-            respectiveContainers, getMonitor());
-    }
-
-    /**
-     * @return
-     */
-    private IProgressMonitor getMonitor()
-    {
-        IProgressMonitor monitor = ThreadProgressMonitor.getProgressMonitor();
-
-        if (monitor == null)
-        {
-            monitor = Job.getJobManager().createProgressGroup();
-        }
-        
-        return monitor;
-    }
-
-    @Override
-    public void initialize(IPath containerPath, IJavaProject project)
-        throws CoreException
-    {
-        ISigilProjectModel sigil = SigilCore.create(project.getProject());
-
-        IClasspathContainer sigilContainer = new SigilClassPathContainer(sigil);
-
-        IJavaProject[] affectedProjects = new IJavaProject[] { project };
-
-        IClasspathContainer[] respectiveContainers = new IClasspathContainer[] { sigilContainer };
-
-        JavaCore.setClasspathContainer(containerPath, affectedProjects,
-            respectiveContainers, getMonitor());
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/classpath/SigilLibraryPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/classpath/SigilLibraryPage.java
deleted file mode 100644
index 1fa13fd..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/classpath/SigilLibraryPage.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.classpath;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-public class SigilLibraryPage extends WizardPage implements IClasspathContainerPage
-{
-
-    private IClasspathEntry classpathEntry;
-
-    public SigilLibraryPage()
-    {
-        super("Sigil");
-    }
-
-    public void createControl(Composite parent)
-    {
-        setTitle("Sigil Library");
-
-        Label label = new Label(parent, SWT.NONE);
-        label.setText("Press Finish to add the Sigil Library");
-        label.setFont(parent.getFont());
-
-        setControl(label);
-    }
-
-    public boolean finish()
-    {
-        classpathEntry = JavaCore.newContainerEntry(new Path(
-            SigilCore.CLASSPATH_CONTAINER_PATH));
-        return true;
-    }
-
-    public boolean isPageComplete()
-    {
-        return true;
-    }
-
-    public IClasspathEntry getSelection()
-    {
-        return classpathEntry;
-    }
-
-    public void setSelection(IClasspathEntry containerEntry)
-    {
-        this.classpathEntry = containerEntry;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/completion/CompletionProposal.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/completion/CompletionProposal.java
deleted file mode 100644
index b74ea93..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/completion/CompletionProposal.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.completion;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-
-class CompletionProposal implements ICompletionProposal
-{
-
-    private int fReplacementOffset;
-    private int fReplacementLength;
-    private int fCursorPosition;
-    private String fReplacementString;
-    private String fAdditionalProposalInfo;
-    private IContextInformation fContextInformation;
-    private String fDisplayString;
-    private Image fImage;
-
-    /**
-     * Creates a new completion proposal based on the provided information. The replacement string is
-     * considered being the display string too. All remaining fields are set to <code>null</code>.
-     *
-     * @param replacementString the actual string to be inserted into the document
-     * @param replacementOffset the offset of the text to be replaced
-     * @param replacementLength the length of the text to be replaced
-     * @param cursorPosition the position of the cursor following the insert relative to replacementOffset
-     */
-    public CompletionProposal(String replacementString, int replacementOffset, int replacementLength, int cursorPosition)
-    {
-        this(replacementString, replacementOffset, replacementLength, cursorPosition,
-            null, null, null, null);
-    }
-
-    /**
-     * Creates a new completion proposal. All fields are initialized based on the provided information.
-     *
-     * @param replacementString the actual string to be inserted into the document
-     * @param replacementOffset the offset of the text to be replaced
-     * @param replacementLength the length of the text to be replaced
-     * @param cursorPosition the position of the cursor following the insert relative to replacementOffset
-     * @param image the image to display for this proposal
-     * @param displayString the string to be displayed for the proposal
-     * @param contextInformation the context information associated with this proposal
-     * @param additionalProposalInfo the additional information associated with this proposal
-     */
-    public CompletionProposal(String replacementString, int replacementOffset, int replacementLength, int cursorPosition, Image image, String displayString, IContextInformation contextInformation, String additionalProposalInfo)
-    {
-        fReplacementString = replacementString;
-        fReplacementOffset = replacementOffset;
-        fReplacementLength = replacementLength;
-        fCursorPosition = cursorPosition;
-        fImage = image;
-        fDisplayString = displayString;
-        fContextInformation = contextInformation;
-        fAdditionalProposalInfo = additionalProposalInfo;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.text.contentassist.ICompletionProposal#apply(org.eclipse.jface.text.IDocument)
-     */
-    public void apply(IDocument document)
-    {
-        try
-        {
-            document.replace(fReplacementOffset, fReplacementLength, fReplacementString);
-        }
-        catch (BadLocationException x)
-        {
-            // ignore
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getAdditionalProposalInfo()
-     */
-    public String getAdditionalProposalInfo()
-    {
-        return fAdditionalProposalInfo;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getContextInformation()
-     */
-    public IContextInformation getContextInformation()
-    {
-        return fContextInformation;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getDisplayString()
-     */
-    public String getDisplayString()
-    {
-        if (fDisplayString != null)
-            return fDisplayString;
-        return fReplacementString;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getImage()
-     */
-    public Image getImage()
-    {
-        return fImage;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getSelection(org.eclipse.jface.text.IDocument)
-     */
-    public Point getSelection(IDocument document)
-    {
-        return new Point(fReplacementOffset + fCursorPosition, 0);
-    }
-
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/AbstractResourceSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/AbstractResourceSection.java
deleted file mode 100644
index 6fb8ee1..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/AbstractResourceSection.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.io.File;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilSection;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceVisitor;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.forms.IManagedForm;
-
-public abstract class AbstractResourceSection extends SigilSection implements IResourceChangeListener, ICheckStateListener
-{
-
-    protected static final Object[] EMPTY = new Object[] {};
-    protected Tree tree;
-    protected CheckboxTreeViewer viewer;
-    private IWorkspace workspace;
-
-    public AbstractResourceSection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(page, parent, project);
-    }
-
-    @Override
-    public void initialize(IManagedForm form)
-    {
-        super.initialize(form);
-        viewer.setAllChecked(false);
-        viewer.setGrayedElements(EMPTY);
-        refreshSelections();
-        viewer.refresh();
-    }
-
-    @Override
-    public void refresh()
-    {
-        refreshSelections();
-        super.refresh();
-    }
-
-    public void checkStateChanged(CheckStateChangedEvent event)
-    {
-        handleStateChanged((IResource) event.getElement(), event.getChecked(), true, true);
-    }
-
-    public void resourceChanged(IResourceChangeEvent event)
-    {
-        if (!getSection().getDisplay().isDisposed())
-        {
-            getSection().getDisplay().asyncExec(new Runnable()
-            {
-                public void run()
-                {
-                    if (getSection().isVisible())
-                    {
-                        viewer.refresh();
-                    }
-                }
-            });
-        }
-    }
-
-    protected void startWorkspaceListener(IWorkspace workspace)
-    {
-        this.workspace = workspace;
-        workspace.addResourceChangeListener(this);
-    }
-
-    @Override
-    public void dispose()
-    {
-        workspace.removeResourceChangeListener(this);
-    }
-
-    protected abstract void refreshSelections();
-
-    protected abstract void syncResourceModel(IResource element, boolean checked);
-
-    protected IResource findResource(IPath path)
-    {
-        IProject project2 = getProjectModel().getProject();
-        File f = project2.getLocation().append(path).toFile();
-
-        if (f.exists())
-        {
-            try
-            {
-                if (f.isFile())
-                {
-                    return project2.getFile(path);
-                }
-                else
-                {
-                    return project2.getFolder(path);
-                }
-            }
-            catch (IllegalArgumentException e)
-            {
-                SigilCore.error("Unknown path " + path);
-                return null;
-            }
-        }
-        else
-        {
-            SigilCore.error("Unknown file " + f);
-            return null;
-        }
-    }
-
-    protected void handleStateChanged(IResource element, boolean checked,
-        boolean recurse, boolean sync)
-    {
-        if (element instanceof IContainer)
-        {
-            setParentsGrayChecked(element, checked);
-            if (recurse)
-            {
-                recursiveCheck((IContainer) element, checked, sync);
-            }
-        }
-        else
-        {
-            setParentsGrayChecked(element, checked);
-        }
-
-        if (sync)
-        {
-            syncResourceModel(element, checked);
-        }
-    }
-
-    private void recursiveCheck(IContainer element, final boolean checked,
-        final boolean sync)
-    {
-        try
-        {
-            element.accept(new IResourceVisitor()
-            {
-                public boolean visit(IResource resource) throws CoreException
-                {
-                    viewer.setChecked(resource, checked);
-                    if (sync)
-                    {
-                        syncResourceModel(resource, checked);
-                    }
-                    return true;
-                }
-            });
-        }
-        catch (CoreException e)
-        {
-            DebugPlugin.log(e.getStatus());
-        }
-    }
-
-    private void setParentsGrayChecked(IResource r, boolean checked)
-    {
-        while (r.getParent() != null)
-        {
-            r = r.getParent();
-            if ((viewer.getGrayed(r) && viewer.getChecked(r)) == checked)
-            {
-                break;
-            }
-            if (viewer.getChecked(r) == checked)
-            {
-                viewer.setGrayed(r, !checked);
-            }
-            else
-            {
-                viewer.setGrayChecked(r, checked);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/BundleDependencySection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/BundleDependencySection.java
deleted file mode 100644
index 76e298a..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/BundleDependencySection.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilSection;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-public abstract class BundleDependencySection extends SigilSection
-{
-
-    protected ProjectTableViewer viewer;
-    private Button add;
-    private Button edit;
-    private Button remove;
-
-    public BundleDependencySection(SigilPage page, Composite parent, ISigilProjectModel project, Set<IModelElement> unresolvedElements) throws CoreException
-    {
-        super(page, parent, project);
-        viewer.setUnresolvedElements(unresolvedElements);
-    }
-
-    public BundleDependencySection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        this(page, parent, project, null);
-    }
-
-    protected abstract String getTitle();
-
-    protected abstract Label createLabel(Composite parent, FormToolkit toolkit);
-
-    protected abstract IContentProvider getContentProvider();
-
-    protected abstract void handleAdd();
-
-    protected abstract void handleEdit();
-
-    protected abstract void handleRemoved();
-
-    @Override
-    public void refresh()
-    {
-        super.refresh();
-        viewer.refresh();
-    }
-
-    protected ISelection getSelection()
-    {
-        return viewer.getSelection();
-    }
-
-    @Override
-    protected void createSection(Section section, FormToolkit toolkit)
-    {
-        setTitle(getTitle());
-
-        Composite body = createGridBody(2, false, toolkit);
-
-        Label label = createLabel(body, toolkit);
-
-        label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 2, 1));
-
-        Table bundleTable = toolkit.createTable(body, SWT.MULTI | SWT.FULL_SELECTION
-            | SWT.VIRTUAL | SWT.BORDER);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        data.heightHint = 600;
-        bundleTable.setLayoutData(data);
-        bundleTable.setLinesVisible(false);
-        createButtons(body, toolkit);
-        createViewer(bundleTable);
-    }
-
-    protected void createButtons(Composite body, FormToolkit toolkit)
-    {
-        Composite buttons = toolkit.createComposite(body);
-        TableWrapLayout layout = new TableWrapLayout();
-        layout.numColumns = 1;
-        layout.topMargin = 0;
-        layout.leftMargin = 0;
-        layout.rightMargin = 0;
-        layout.bottomMargin = 0;
-        buttons.setLayout(layout);
-        GridData data = new GridData();
-        data.verticalAlignment = SWT.TOP;
-        buttons.setLayoutData(data);
-
-        add = toolkit.createButton(buttons, "Add", SWT.NULL);
-        add.setLayoutData(new TableWrapData(TableWrapData.FILL));
-        add.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleAdd();
-            }
-        });
-
-        edit = toolkit.createButton(buttons, "Edit", SWT.NULL);
-        edit.setLayoutData(new TableWrapData(TableWrapData.FILL));
-        edit.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleEdit();
-            }
-        });
-
-        remove = toolkit.createButton(buttons, "Remove", SWT.NULL);
-        remove.setLayoutData(new TableWrapData(TableWrapData.FILL));
-        remove.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleRemoved();
-            }
-        });
-
-        setSelected(false);
-    }
-
-    protected void createViewer(Table bundleTable)
-    {
-        viewer = new ProjectTableViewer(bundleTable);
-        viewer.setContentProvider(getContentProvider());
-        viewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                setSelected(!event.getSelection().isEmpty());
-            }
-        });
-    }
-
-    private void setSelected(boolean selected)
-    {
-        edit.setEnabled(selected);
-        remove.setEnabled(selected);
-    }
-
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ClasspathSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ClasspathSection.java
deleted file mode 100644
index 6261f21..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ClasspathSection.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilSection;
-import org.apache.felix.sigil.eclipse.ui.util.BackgroundLoadingSelectionDialog;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.apache.felix.sigil.eclipse.ui.util.IElementDescriptor;
-import org.apache.felix.sigil.eclipse.ui.util.IFilter;
-import org.apache.felix.sigil.eclipse.ui.util.ModelLabelProvider;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-public class ClasspathSection extends SigilSection
-{
-
-    private ProjectTableViewer viewer;
-    private final Comparator<IClasspathEntry> CLASSPATH_COMPARATOR = new Comparator<IClasspathEntry>()
-    {
-        public int compare(IClasspathEntry o1, IClasspathEntry o2)
-        {
-            return compareClasspaths(o1, o2);
-        }
-    };
-
-    public ClasspathSection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(page, parent, project);
-    }
-
-    @Override
-    protected void createSection(Section section, FormToolkit toolkit)
-    {
-        setTitle("Classpath");
-
-        Composite body = createGridBody(2, false, toolkit);
-
-        Label label = toolkit.createLabel(body,
-            "Specify the internal classpath of this bundle.");
-        label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 2, 1));
-
-        Table bundleTable = toolkit.createTable(body, SWT.MULTI | SWT.FULL_SELECTION
-            | SWT.VIRTUAL | SWT.BORDER);
-        GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
-        tableLayoutData.heightHint = 150;
-        bundleTable.setLayoutData(tableLayoutData);
-
-        createButtons(body, toolkit);
-        createViewer(bundleTable);
-    }
-
-    private void createButtons(Composite body, FormToolkit toolkit)
-    {
-        Composite buttons = toolkit.createComposite(body);
-        TableWrapLayout layout = new TableWrapLayout();
-        layout.numColumns = 1;
-        layout.topMargin = 0;
-        layout.leftMargin = 0;
-        layout.rightMargin = 0;
-        layout.bottomMargin = 0;
-        buttons.setLayout(layout);
-
-        Button add = toolkit.createButton(buttons, "Add", SWT.NULL);
-        add.setLayoutData(new TableWrapData(TableWrapData.FILL));
-        add.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleAdd();
-            }
-        });
-
-        Button remove = toolkit.createButton(buttons, "Remove", SWT.NULL);
-        remove.setLayoutData(new TableWrapData(TableWrapData.FILL));
-        remove.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleRemoved();
-            }
-        });
-    }
-
-    private void createViewer(Table bundleTable)
-    {
-        viewer = new ProjectTableViewer(bundleTable);
-        viewer.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                ArrayList<IClasspathEntry> cp = new ArrayList<IClasspathEntry>();
-                for (IClasspathEntry cpe : JavaHelper.findClasspathEntries(getBundle()))
-                {
-                    cp.add(cpe);
-                }
-
-                Collections.sort(cp, new Comparator<IClasspathEntry>()
-                {
-                    public int compare(IClasspathEntry o1, IClasspathEntry o2)
-                    {
-                        return o1.toString().compareTo(o2.toString());
-                    }
-                });
-                return cp.toArray();
-            }
-        });
-        viewer.setComparator(new ViewerComparator()
-        {
-            @Override
-            public int category(Object element)
-            {
-                return index((IClasspathEntry) element);
-            }
-        });
-    }
-
-    protected ISigilBundle getBundle()
-    {
-        return getProjectModel().getBundle();
-    }
-
-    private void handleAdd()
-    {
-        try
-        {
-            BackgroundLoadingSelectionDialog<IClasspathEntry> dialog = new BackgroundLoadingSelectionDialog<IClasspathEntry>(
-                getSection().getShell(), "Classpath Entry:", true);
-
-            dialog.setDescriptor(new IElementDescriptor<IClasspathEntry>()
-            {
-                public String getName(IClasspathEntry element)
-                {
-                    return element.getPath().toString();
-                }
-
-                public String getLabel(IClasspathEntry element)
-                {
-                    return getName(element);
-                }
-            });
-
-            dialog.setLabelProvider(new ModelLabelProvider());
-
-            dialog.setFilter(new IFilter<IClasspathEntry>()
-            {
-                public boolean select(IClasspathEntry cp)
-                {
-                    switch (cp.getEntryKind())
-                    {
-                        case IClasspathEntry.CPE_LIBRARY:
-                        case IClasspathEntry.CPE_VARIABLE:
-                        case IClasspathEntry.CPE_SOURCE:
-                            return !getBundle().getClasspathEntrys().contains(encode(cp));
-                        default:
-                            return false;
-                    }
-                }
-            });
-
-            dialog.setComparator(CLASSPATH_COMPARATOR);
-
-            IClasspathEntry[] classpath = getProjectModel().getJavaModel().getRawClasspath();
-            dialog.addElements(Arrays.asList(classpath));
-            if (dialog.open() == Window.OK)
-            {
-                List<IClasspathEntry> selectedElements = dialog.getSelectedElements();
-
-                Object[] added = selectedElements.toArray();
-                for (IClasspathEntry entry : selectedElements)
-                {
-                    getBundle().addClasspathEntry(encode(entry));
-                }
-                viewer.add(added);
-                viewer.refresh();
-                markDirty();
-            }
-        }
-        catch (JavaModelException e)
-        {
-            ErrorDialog.openError(getSection().getShell(), "Error", null, e.getStatus());
-        }
-    }
-
-    private int compareClasspaths(IClasspathEntry o1, IClasspathEntry o2)
-    {
-        if (o1.getEntryKind() == o2.getEntryKind())
-        {
-            ModelLabelProvider mlp = viewer.getLabelProvider();
-            return mlp.getText(o1).compareTo(mlp.getText(o2));
-        }
-        else
-        {
-            int i1 = index(o1);
-            int i2 = index(o2);
-
-            if (i1 < i2)
-            {
-                return -1;
-            }
-            else
-            {
-                return 1;
-            }
-        }
-    }
-
-    private static int index(IClasspathEntry o1)
-    {
-        switch (o1.getEntryKind())
-        {
-            case IClasspathEntry.CPE_SOURCE:
-                return 0;
-            case IClasspathEntry.CPE_PROJECT:
-                return 1;
-            case IClasspathEntry.CPE_LIBRARY:
-                return 2;
-            case IClasspathEntry.CPE_VARIABLE:
-                return 3;
-            case IClasspathEntry.CPE_CONTAINER:
-                return 4;
-            default:
-                throw new IllegalStateException("Unknown classpath entry type " + o1);
-        }
-    }
-
-    private String encode(IClasspathEntry cp)
-    {
-        return getProjectModel().getJavaModel().encodeClasspathEntry(cp).trim();
-    }
-
-    @SuppressWarnings("unchecked")
-    private void handleRemoved()
-    {
-        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-
-        if (!selection.isEmpty())
-        {
-            for (Iterator<IClasspathEntry> i = selection.iterator(); i.hasNext();)
-            {
-                getBundle().removeClasspathEntry(
-                    getProjectModel().getJavaModel().encodeClasspathEntry(i.next()).trim());
-            }
-            viewer.remove(selection.toArray());
-            markDirty();
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ContentSummarySection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ContentSummarySection.java
deleted file mode 100644
index f0eedf4..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ContentSummarySection.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilSection;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-public class ContentSummarySection extends SigilSection
-{
-
-    public ContentSummarySection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(page, parent, project);
-    }
-
-    @Override
-    protected void createSection(Section section, FormToolkit toolkit)
-    {
-        setTitle("Project Content");
-
-        Composite body = createTableWrapBody(2, toolkit);
-        Hyperlink link = toolkit.createHyperlink(body, "Contents:", SWT.NONE);
-        link.setHref(ContentsForm.PAGE_ID);
-        link.addHyperlinkListener(this);
-        toolkit.createLabel(body, "Manage the content that this bundle provides.");
-
-        link = toolkit.createHyperlink(body, "Dependencies:", SWT.NONE);
-        link.setHref(DependenciesForm.PAGE_ID);
-        link.addHyperlinkListener(this);
-        toolkit.createLabel(body,
-            "Manage the dependencies that this bundle needs to run.");
-
-        link = toolkit.createHyperlink(body, "Exports:", SWT.NONE);
-        link.setHref(ExportsForm.PAGE_ID);
-        link.addHyperlinkListener(this);
-        toolkit.createLabel(body, "Manage the resources that this bundle exports.");
-    }
-
-    @Override
-    public void linkActivated(HyperlinkEvent e)
-    {
-        getPage().getEditor().setActivePage((String) e.getHref());
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ContentsForm.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ContentsForm.java
deleted file mode 100644
index 0271305..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ContentsForm.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-public class ContentsForm extends SigilPage
-{
-
-    public static final String PAGE_ID = "contents";
-
-    private ISigilProjectModel project;
-
-    public ContentsForm(FormEditor editor, ISigilProjectModel project)
-    {
-        super(editor, PAGE_ID, "Contents");
-        this.project = project;
-    }
-
-    @Override
-    protected void createFormContent(IManagedForm managedForm)
-    {
-        FormToolkit toolkit = managedForm.getToolkit();
-
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Contents");
-
-        Composite body = form.getBody();
-        TableWrapLayout layout = new TableWrapLayout();
-        layout.bottomMargin = 10;
-        layout.topMargin = 5;
-        layout.leftMargin = 10;
-        layout.rightMargin = 10;
-        layout.numColumns = 1;
-        layout.horizontalSpacing = 10;
-        body.setLayout(layout);
-        body.setLayoutData(new TableWrapData(TableWrapData.FILL));
-
-        Composite top = toolkit.createComposite(body);
-        layout = new TableWrapLayout();
-        layout.verticalSpacing = 20;
-        top.setLayout(layout);
-        TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
-        //data.colspan = 2;
-        top.setLayoutData(data);
-
-        Composite bottom = toolkit.createComposite(body);
-        layout = new TableWrapLayout();
-        layout.verticalSpacing = 20;
-        bottom.setLayout(layout);
-        bottom.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-
-        try
-        {
-            ClasspathSection classpath = new ClasspathSection(this, top, project);
-            managedForm.addPart(classpath);
-
-            ResourceBuildSection runtimeBuild = new ResourceBuildSection(this, bottom,
-                project);
-            managedForm.addPart(runtimeBuild);
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to create contents form", e);
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/DependenciesForm.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/DependenciesForm.java
deleted file mode 100644
index abb94ea..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/DependenciesForm.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-public class DependenciesForm extends SigilPage
-{
-
-    public static final String PAGE_ID = "dependencies";
-
-    private final ISigilProjectModel project;
-    private final Set<IModelElement> unresolvedElements;
-
-    private ImportPackagesSection importPackages;
-    private RequiresBundleSection requiresSection;
-
-    public DependenciesForm(FormEditor editor, ISigilProjectModel project, Set<IModelElement> unresolved)
-    {
-        super(editor, PAGE_ID, "Dependencies");
-        this.project = project;
-        this.unresolvedElements = unresolved;
-    }
-
-    @Override
-    public boolean canLeaveThePage()
-    {
-        return !isDirty();
-    }
-
-    @Override
-    protected void createFormContent(IManagedForm managedForm)
-    {
-        FormToolkit toolkit = managedForm.getToolkit();
-
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Dependencies");
-
-        Composite body = form.getBody();
-        TableWrapLayout layout = new TableWrapLayout();
-        layout.bottomMargin = 10;
-        layout.topMargin = 5;
-        layout.leftMargin = 10;
-        layout.rightMargin = 10;
-        layout.numColumns = 2;
-        layout.horizontalSpacing = 10;
-        body.setLayout(layout);
-        body.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-
-        Composite left = toolkit.createComposite(body);
-        layout = new TableWrapLayout();
-        layout.verticalSpacing = 20;
-        left.setLayout(layout);
-        TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB);
-        layoutData.rowspan = 2;
-        left.setLayoutData(layoutData);
-
-        Composite right = toolkit.createComposite(body);
-        layout = new TableWrapLayout();
-        layout.verticalSpacing = 20;
-        right.setLayout(layout);
-        right.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-
-        Composite bottom = toolkit.createComposite(body);
-        layout = new TableWrapLayout();
-        layout.verticalSpacing = 20;
-        bottom.setLayout(layout);
-        bottom.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-
-        try
-        {
-            importPackages = new ImportPackagesSection(this, left, project,
-                unresolvedElements);
-            managedForm.addPart(importPackages);
-
-            requiresSection = new RequiresBundleSection(this, right, project,
-                unresolvedElements);
-            managedForm.addPart(requiresSection);
-
-            DependencyManagementSection depMgmt = new DependencyManagementSection(this,
-                bottom, project);
-            managedForm.addPart(depMgmt);
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to create dependencies form", e);
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/DependencyManagementSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/DependencyManagementSection.java
deleted file mode 100644
index f8fd0ef..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/DependencyManagementSection.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.ModelHelper;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilSection;
-import org.apache.felix.sigil.eclipse.ui.util.AccumulatorAdapter;
-import org.apache.felix.sigil.eclipse.ui.util.ExportedPackageFinder;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IImportDeclaration;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.AbstractFormPart;
-import org.eclipse.ui.forms.IFormPart;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-public class DependencyManagementSection extends SigilSection
-{
-
-    private Hyperlink hypConvertRBtoIP;
-
-    public DependencyManagementSection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(page, parent, project);
-    }
-
-    protected void createSection(Section section, FormToolkit toolkit)
-        throws CoreException
-    {
-        setTitle("Dependency Management");
-
-        Composite body = createGridBody(1, false, toolkit);
-
-        hypConvertRBtoIP = toolkit.createHyperlink(body,
-            "Convert Required Bundles to Imported Packages", SWT.NONE);
-        hypConvertRBtoIP.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
-        hypConvertRBtoIP.addHyperlinkListener(new HyperlinkAdapter()
-        {
-            public void linkActivated(HyperlinkEvent e)
-            {
-                run();
-            }
-        });
-    }
-
-    protected void run()
-    {
-        final Map<String, IPackageExport> exports = new HashMap<String, IPackageExport>();
-        final Set<String> imports = new HashSet<String>();
-
-        // Find all exports
-        final ExportedPackageFinder exportFinder = new ExportedPackageFinder(
-            getProjectModel(), new AccumulatorAdapter<IPackageExport>()
-            {
-                public void addElements(Collection<? extends IPackageExport> elements)
-                {
-                    for (IPackageExport export : elements)
-                    {
-                        exports.put(export.getPackageName(), export);
-                    }
-                }
-            });
-        Job findExportsJob = new Job("Find exports")
-        {
-            protected IStatus run(IProgressMonitor monitor)
-            {
-                return exportFinder.run(monitor);
-            }
-        };
-        findExportsJob.setUser(true);
-        findExportsJob.schedule();
-
-        // Find imports from Java source
-        Job findImportsJob = new Job("Find imports")
-        {
-            protected IStatus run(IProgressMonitor monitor)
-            {
-                IJavaProject javaProject = getProjectModel().getJavaModel();
-                try
-                {
-                    IPackageFragment[] packages = javaProject.getPackageFragments();
-                    for (IPackageFragment pkg : packages)
-                    {
-                        ICompilationUnit[] compilationUnits = pkg.getCompilationUnits();
-                        for (ICompilationUnit compilationUnit : compilationUnits)
-                        {
-                            IImportDeclaration[] importDecls = compilationUnit.getImports();
-                            for (IImportDeclaration importDecl : importDecls)
-                            {
-                                imports.add(getPackageName(importDecl));
-                            }
-                        }
-                    }
-                    return Status.OK_STATUS;
-                }
-                catch (JavaModelException e)
-                {
-                    return new Status(IStatus.ERROR, SigilUI.PLUGIN_ID, 0,
-                        "Error finding imports", e);
-                }
-            }
-        };
-        findImportsJob.setUser(true);
-        findImportsJob.schedule();
-
-        // Wait for both jobs to complete
-        try
-        {
-            findImportsJob.join();
-            findExportsJob.join();
-        }
-        catch (InterruptedException e)
-        {
-            // Aborted, just do nothing
-            return;
-        }
-
-        // Get the existing imports for the bundle
-        IBundleModelElement bundleInfo = getProjectModel().getBundle().getBundleInfo();
-        Collection<IPackageImport> existingImports = bundleInfo.getImports();
-        Map<String, IPackageImport> existingImportsMap = new HashMap<String, IPackageImport>();
-        for (IPackageImport existingImport : existingImports)
-        {
-            existingImportsMap.put(existingImport.getPackageName(), existingImport);
-        }
-
-        // Add imports to the bundle
-        ModelElementFactory elementFactory = ModelElementFactory.getInstance();
-        int count = 0;
-        for (String pkgImport : imports)
-        {
-            IPackageExport export = exports.get(pkgImport);
-            if (export != null && !existingImportsMap.containsKey(pkgImport))
-            {
-                VersionRange versionRange = ModelHelper.getDefaultRange(export.getVersion());
-                IPackageImport newImport = elementFactory.newModelElement(IPackageImport.class);
-                newImport.setPackageName(pkgImport);
-                newImport.setVersions(versionRange);
-                newImport.setOptional(false);
-
-                bundleInfo.addImport(newImport);
-                count++;
-            }
-        }
-
-        // Remove required bundles
-        Collection<IRequiredBundle> requiredBundles = bundleInfo.getRequiredBundles();
-        int requiredBundlesSize = requiredBundles.size();
-        for (IRequiredBundle requiredBundle : requiredBundles)
-        {
-            bundleInfo.removeRequiredBundle(requiredBundle);
-        }
-
-        // Update the editor
-        if (count + requiredBundlesSize > 0)
-        {
-            IFormPart[] parts = getPage().getManagedForm().getParts();
-            for (IFormPart formPart : parts)
-            {
-                formPart.refresh();
-                ((AbstractFormPart) formPart).markDirty();
-            }
-        }
-
-        MessageDialog.openInformation(getManagedForm().getForm().getShell(),
-            "Dependency Management", "Removed " + requiredBundlesSize
-                + " required bundle(s) and added " + count + " imported package(s).");
-    }
-
-    private static String getPackageName(IImportDeclaration decl)
-    {
-        String name = decl.getElementName();
-        int lastDot = name.lastIndexOf('.');
-        return name.substring(0, lastDot);
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ExcludedResourcesFilter.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ExcludedResourcesFilter.java
deleted file mode 100644
index 4a94341..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ExcludedResourcesFilter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.preferences.PrefsUtils;
-import org.apache.felix.sigil.utils.GlobCompiler;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-public class ExcludedResourcesFilter extends ViewerFilter
-{
-
-    private final Set<Pattern> exclusionSet = new HashSet<Pattern>();
-
-    public ExcludedResourcesFilter()
-    {
-        loadExclusions();
-    }
-
-    public final synchronized void loadExclusions()
-    {
-        exclusionSet.clear();
-        IPreferenceStore store = SigilCore.getDefault().getPreferenceStore();
-        String[] exclusions = PrefsUtils.stringToArray(store.getString(SigilCore.DEFAULT_EXCLUDED_RESOURCES));
-        for (String exclusion : exclusions)
-        {
-            exclusionSet.add(GlobCompiler.compile(exclusion));
-        }
-    }
-
-    @Override
-    public synchronized boolean select(Viewer viewer, Object parentElement, Object element)
-    {
-        IResource file = (IResource) element;
-        String path = file.getName();
-        for (Pattern p : exclusionSet)
-        {
-            if (p.matcher(path).matches())
-            {
-                return false;
-            }
-        }
-        return true;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ExportPackagesSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ExportPackagesSection.java
deleted file mode 100644
index 74daa93..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ExportPackagesSection.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.ModelElementFactoryException;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.ModelHelper;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.internal.preferences.OptionalPrompt;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.apache.felix.sigil.eclipse.ui.util.ResourcesDialogHelper;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.osgi.framework.Version;
-
-public class ExportPackagesSection extends BundleDependencySection
-{
-
-    public ExportPackagesSection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(page, parent, project);
-    }
-
-    @Override
-    protected String getTitle()
-    {
-        return "Export Packages";
-    }
-
-    @Override
-    protected Label createLabel(Composite parent, FormToolkit toolkit)
-    {
-        return toolkit.createLabel(parent,
-            "Specify which packages this bundle shares with other bundles.");
-    }
-
-    @Override
-    protected IContentProvider getContentProvider()
-    {
-        return new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return getBundle().getBundleInfo().getExports().toArray();
-            }
-        };
-    }
-
-    @Override
-    protected void handleAdd()
-    {
-        NewPackageExportDialog dialog = ResourcesDialogHelper.createNewExportDialog(
-            getSection().getShell(), "Add Exported Package", null, getProjectModel(),
-            true);
-
-        if (dialog.open() == Window.OK)
-        {
-            try
-            {
-                // Add selected exports
-                boolean exportsAdded = false;
-
-                List<IPackageFragment> newPkgFragments = dialog.getSelectedElements();
-                for (IPackageFragment pkgFragment : newPkgFragments)
-                {
-                    IPackageExport pkgExport = ModelElementFactory.getInstance().newModelElement(
-                        IPackageExport.class);
-                    pkgExport.setPackageName(pkgFragment.getElementName());
-                    pkgExport.setVersion(dialog.getVersion());
-                    getBundle().getBundleInfo().addExport(pkgExport);
-
-                    exportsAdded = true;
-                }
-
-                // Add corresponding imports (maybe)
-                boolean importsAdded = false;
-
-                boolean shouldAddImports = OptionalPrompt.optionallyPrompt(
-                    SigilCore.PREFERENCES_ADD_IMPORT_FOR_EXPORT, "Add Exports",
-                    "Should corresponding imports be added?", getSection().getShell());
-                if (shouldAddImports)
-                {
-                    for (IPackageFragment pkgFragment : newPkgFragments)
-                    {
-                        IPackageImport pkgImport = ModelElementFactory.getInstance().newModelElement(
-                            IPackageImport.class);
-                        pkgImport.setPackageName(pkgFragment.getElementName());
-                        Version version = dialog.getVersion();
-                        if (version == null)
-                        {
-                            version = getBundle().getVersion();
-                        }
-                        VersionRange versionRange = ModelHelper.getDefaultRange(version);
-                        pkgImport.setVersions(versionRange);
-
-                        getBundle().getBundleInfo().addImport(pkgImport);
-
-                        importsAdded = true;
-                    }
-                }
-
-                if (importsAdded)
-                {
-                    refreshAllPages();
-                    markDirty();
-                }
-                else if (exportsAdded)
-                {
-                    refresh();
-                    markDirty();
-                }
-            }
-            catch (ModelElementFactoryException e)
-            {
-                SigilCore.error("Failed to buiild model element for package export", e);
-            }
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected void handleEdit()
-    {
-        IStructuredSelection selection = (IStructuredSelection) getSelection();
-
-        boolean changed = false;
-
-        if (!selection.isEmpty())
-        {
-            for (Iterator<IPackageExport> i = selection.iterator(); i.hasNext();)
-            {
-                IPackageExport packageExport = i.next();
-                NewPackageExportDialog dialog = ResourcesDialogHelper.createNewExportDialog(
-                    getSection().getShell(), "Edit Imported Package", packageExport,
-                    getProjectModel(), false);
-                if (dialog.open() == Window.OK)
-                {
-                    changed = true;
-                    IPackageFragment pkgFragment = dialog.getSelectedElement();
-                    packageExport.setPackageName(pkgFragment.getElementName());
-                    packageExport.setVersion(dialog.getVersion());
-                }
-            }
-        }
-
-        if (changed)
-        {
-            refresh();
-            markDirty();
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected void handleRemoved()
-    {
-        IStructuredSelection selection = (IStructuredSelection) getSelection();
-
-        if (!selection.isEmpty())
-        {
-            boolean importsRemoved = false;
-
-            boolean shouldRemoveImports = OptionalPrompt.optionallyPrompt(
-                SigilCore.PREFERENCES_REMOVE_IMPORT_FOR_EXPORT, "Remove Exports",
-                "Should corresponding imports be removed?", getSection().getShell());
-
-            // TODO should also prompt to remove corresponding imports from other
-            // projects in workspace??
-            
-            IBundleModelElement info = getBundle().getBundleInfo();
-
-            for (Iterator<IPackageExport> i = selection.iterator(); i.hasNext();)
-            {
-                IPackageExport pe = i.next();
-                info.removeExport(pe);
-
-                // Remove corresponding imports (maybe)
-                if (shouldRemoveImports)
-                {
-                    for (IPackageImport pi : info.getImports())
-                    {
-                        if (pi.getPackageName().equals(pe.getPackageName()))
-                        {
-                            importsRemoved = true;
-                            info.removeImport(pi);
-                        }
-                    }
-                }
-            }
-
-            if (importsRemoved)
-            {
-                refreshAllPages();
-            }
-            else
-            {
-                refresh();
-            }
-
-            markDirty();
-        }
-    }
-
-    /**
-     * 
-     */
-    private void refreshAllPages()
-    {
-        ((SigilProjectEditorPart) getPage().getEditor()).refreshAllPages();
-    }
-
-    private ISigilBundle getBundle()
-    {
-        return getProjectModel().getBundle();
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ExportsForm.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ExportsForm.java
deleted file mode 100644
index 9537ff6..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ExportsForm.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-public class ExportsForm extends SigilPage
-{
-
-    public static final String PAGE_ID = "exports";
-
-    private ISigilProjectModel project;
-
-    public ExportsForm(FormEditor editor, ISigilProjectModel project)
-    {
-        super(editor, PAGE_ID, "Exports");
-        this.project = project;
-    }
-
-    @Override
-    protected void createFormContent(IManagedForm managedForm)
-    {
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Exports");
-
-        Composite body = form.getBody();
-        TableWrapLayout layout = new TableWrapLayout();
-        layout.bottomMargin = 10;
-        layout.topMargin = 5;
-        layout.leftMargin = 10;
-        layout.rightMargin = 10;
-        layout.numColumns = 1;
-        layout.horizontalSpacing = 10;
-        layout.verticalSpacing = 20;
-        body.setLayout(layout);
-        body.setLayoutData(new TableWrapData(TableWrapData.FILL));
-
-        try
-        {
-            ExportPackagesSection exportPackages = new ExportPackagesSection(this, body,
-                project);
-            managedForm.addPart(exportPackages);
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to create contents form", e);
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/GeneralInfoSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/GeneralInfoSection.java
deleted file mode 100644
index 850a9e4..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/GeneralInfoSection.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.IFormValueConverter;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilFormEntry;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilFormEntryAdapter;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilSection;
-import org.apache.felix.sigil.eclipse.ui.util.BackgroundLoadingSelectionDialog;
-import org.apache.felix.sigil.eclipse.ui.util.ResourcesDialogHelper;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.Version;
-
-/**
- * @author dave
- *
- */
-public class GeneralInfoSection extends SigilSection
-{
-
-    private String name;
-    private String symbolicName;
-    private Version version;
-    private String description;
-    private String provider;
-    private String activator;
-    private IRequiredBundle fragmentHost;
-
-    private SigilFormEntry nameEntry;
-    private SigilFormEntry symbolicNameEntry;
-    private SigilFormEntry versionEntry;
-    private SigilFormEntry descriptionEntry;
-    private SigilFormEntry providerEntry;
-    private SigilFormEntry activatorEntry;
-    private SigilFormEntry fragmentHostEntry;
-
-    /**
-     * @param parent
-     * @param toolkit
-     * @param style
-     * @throws CoreException 
-     */
-    public GeneralInfoSection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(page, parent, project);
-    }
-
-    protected void createSection(Section section, FormToolkit toolkit)
-    {
-        setTitle("General Information");
-
-        Composite body = createGridBody(3, false, toolkit);
-
-        Label label = toolkit.createLabel(body,
-            "This section describes general information about this project.");
-        label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 3, 1));
-
-        symbolicNameEntry = new SigilFormEntry(body, toolkit, "Symbolic Name");
-        symbolicNameEntry.setFormEntryListener(new SigilFormEntryAdapter()
-        {
-            @Override
-            public void textValueChanged(SigilFormEntry form)
-            {
-                symbolicName = nullIfEmpty((String) form.getValue());
-                checkDirty();
-            }
-        });
-
-        nameEntry = new SigilFormEntry(body, toolkit, "Name");
-        nameEntry.setFormEntryListener(new SigilFormEntryAdapter()
-        {
-            @Override
-            public void textValueChanged(SigilFormEntry form)
-            {
-                name = nullIfEmpty((String) form.getValue());
-                checkDirty();
-            }
-        });
-
-        descriptionEntry = new SigilFormEntry(body, toolkit, "Description");
-        descriptionEntry.setFormEntryListener(new SigilFormEntryAdapter()
-        {
-            @Override
-            public void textValueChanged(SigilFormEntry form)
-            {
-                description = nullIfEmpty((String) form.getValue());
-                checkDirty();
-            }
-        });
-
-        IFormValueConverter converter = new IFormValueConverter()
-        {
-            public String getLabel(Object value)
-            {
-                Version v = (Version) value;
-                return v.toString();
-            }
-
-            public Object getValue(String label)
-            {
-                return VersionTable.getVersion(label);
-            }
-        };
-
-        versionEntry = new SigilFormEntry(body, toolkit, "Version", null, converter);
-        versionEntry.setFormEntryListener(new SigilFormEntryAdapter()
-        {
-            @Override
-            public void textValueChanged(SigilFormEntry form)
-            {
-                version = (Version) form.getValue();
-                checkDirty();
-            }
-        });
-
-        providerEntry = new SigilFormEntry(body, toolkit, "Provider");
-        providerEntry.setFormEntryListener(new SigilFormEntryAdapter()
-        {
-            @Override
-            public void textValueChanged(SigilFormEntry form)
-            {
-                provider = nullIfEmpty((String) form.getValue());
-                checkDirty();
-            }
-        });
-
-        activatorEntry = new SigilFormEntry(body, toolkit, "Bundle Activator",
-            "Browse...", null);
-        activatorEntry.setFormEntryListener(new SigilFormEntryAdapter()
-        {
-            @Override
-            public void textValueChanged(SigilFormEntry form)
-            {
-                activator = (String) form.getValue();
-                checkDirty();
-            }
-
-            @Override
-            public void browseButtonSelected(SigilFormEntry form)
-            {
-                BackgroundLoadingSelectionDialog<String> dialog = ResourcesDialogHelper.createClassSelectDialog(
-                    getShell(), "Add Bundle Activator", getProjectModel(), activator,
-                    BundleActivator.class.getName());
-
-                if (dialog.open() == Window.OK)
-                {
-                    form.setValue(dialog.getSelectedElement());
-                }
-            }
-        });
-
-        converter = new IFormValueConverter()
-        {
-            public String getLabel(Object value)
-            {
-                IRequiredBundle b = (IRequiredBundle) value;
-                return b == null ? null : b.getSymbolicName() + " " + b.getVersions();
-            }
-
-            public Object getValue(String label)
-            {
-                return null;
-            }
-        };
-
-        fragmentHostEntry = new SigilFormEntry(body, toolkit, "Fragment Host",
-            "Browse...", converter);
-        fragmentHostEntry.setFormEntryListener(new SigilFormEntryAdapter()
-        {
-            @Override
-            public void textValueChanged(SigilFormEntry form)
-            {
-                fragmentHost = (IRequiredBundle) form.getValue();
-                checkDirty();
-            }
-
-            @Override
-            public void browseButtonSelected(SigilFormEntry form)
-            {
-                NewResourceSelectionDialog<IBundleModelElement> dialog = ResourcesDialogHelper.createRequiredBundleDialog(
-                    getSection().getShell(), "Add Required Bundle", getProjectModel(),
-                    null, getBundle().getBundleInfo().getRequiredBundles());
-
-                if (dialog.open() == Window.OK)
-                {
-                    IRequiredBundle required = ModelElementFactory.getInstance().newModelElement(
-                        IRequiredBundle.class);
-                    required.setSymbolicName(dialog.getSelectedName());
-                    required.setVersions(dialog.getSelectedVersions());
-                    form.setValue(required);
-                }
-            }
-        });
-        fragmentHostEntry.setFreeText(false);
-    }
-
-    private static String nullIfEmpty(String value)
-    {
-        if (value.trim().length() == 0)
-        {
-            return null;
-        }
-        return value;
-    }
-
-    private Shell getShell()
-    {
-        return getSection().getShell();
-    }
-
-    @Override
-    public void commit(boolean onSave)
-    {
-        getBundle().getBundleInfo().setSymbolicName(symbolicName);
-        getBundle().getBundleInfo().setName(name);
-        getBundle().getBundleInfo().setVersion(version);
-        getBundle().getBundleInfo().setDescription(description);
-        getBundle().getBundleInfo().setVendor(provider);
-        getBundle().getBundleInfo().setFragmentHost(fragmentHost);
-        getBundle().getBundleInfo().setActivator(activator);
-
-        super.commit(onSave);
-    }
-
-    @Override
-    public void refresh()
-    {
-        symbolicName = getProjectModel().getBundle().getBundleInfo().getSymbolicName();
-        name = getProjectModel().getBundle().getBundleInfo().getName();
-        description = getProjectModel().getBundle().getBundleInfo().getDescription();
-        version = getProjectModel().getBundle().getBundleInfo().getVersion();
-        provider = getProjectModel().getBundle().getBundleInfo().getVendor();
-        fragmentHost = getProjectModel().getBundle().getBundleInfo().getFragmentHost();
-        activator = getProjectModel().getBundle().getBundleInfo().getActivator();
-
-        nameEntry.setValue(name);
-        symbolicNameEntry.setValue(symbolicName);
-        versionEntry.setValue(version);
-        descriptionEntry.setValue(description);
-        providerEntry.setValue(provider);
-        fragmentHostEntry.setValue(fragmentHost);
-        activatorEntry.setValue(activator);
-
-        super.refresh();
-    }
-
-    private void checkDirty()
-    {
-        boolean dirty = different(symbolicName,
-            getProjectModel().getBundle().getBundleInfo().getSymbolicName())
-            || different(name, getProjectModel().getBundle().getBundleInfo().getName())
-            || different(version,
-                getProjectModel().getBundle().getBundleInfo().getVersion())
-            || different(description,
-                getProjectModel().getBundle().getBundleInfo().getDescription())
-            || different(provider,
-                getProjectModel().getBundle().getBundleInfo().getVendor())
-            || different(fragmentHost,
-                getProjectModel().getBundle().getBundleInfo().getFragmentHost())
-            || different(activator,
-                getProjectModel().getBundle().getBundleInfo().getActivator());
-
-        if (dirty)
-            markDirty();
-    }
-
-    private boolean different(Object val1, Object val2)
-    {
-        return val1 == null ? val2 != null : !val1.equals(val2);
-    }
-
-    private ISigilBundle getBundle()
-    {
-        return getProjectModel().getBundle();
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/IDependencyChecker.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/IDependencyChecker.java
deleted file mode 100644
index e78c0df..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/IDependencyChecker.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-
-public interface IDependencyChecker
-{
-    boolean isSatisfied(IPackageImport packageImport);
-
-    boolean isSatisfied(IRequiredBundle requiredBundle);
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ImportPackagesSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ImportPackagesSection.java
deleted file mode 100644
index 993a406..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ImportPackagesSection.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IPackageModelElement;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.apache.felix.sigil.eclipse.ui.util.ResourcesDialogHelper;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-public class ImportPackagesSection extends BundleDependencySection
-{
-
-    public ImportPackagesSection(SigilPage page, Composite parent, ISigilProjectModel project, Set<IModelElement> unresolvedPackages) throws CoreException
-    {
-        super(page, parent, project, unresolvedPackages);
-    }
-
-    @Override
-    protected String getTitle()
-    {
-        return "Import Packages";
-    }
-
-    @Override
-    protected Label createLabel(Composite parent, FormToolkit toolkit)
-    {
-        return toolkit.createLabel(parent,
-            "Specify which packages this bundle imports from other bundles.");
-    }
-
-    @Override
-    protected IContentProvider getContentProvider()
-    {
-        return new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                ArrayList<IPackageImport> imports = new ArrayList<IPackageImport>(
-                    getBundle().getBundleInfo().getImports());
-                Collections.sort(imports, new Comparator<IPackageImport>()
-                {
-                    public int compare(IPackageImport o1, IPackageImport o2)
-                    {
-                        return o1.getPackageName().compareTo(o2.getPackageName());
-                    }
-                });
-                return imports.toArray();
-            }
-        };
-    }
-
-    protected ISigilBundle getBundle()
-    {
-        return getProjectModel().getBundle();
-    }
-
-    @Override
-    protected void handleAdd()
-    {
-        NewResourceSelectionDialog<? extends IPackageModelElement> dialog = ResourcesDialogHelper.createImportDialog(
-            getSection().getShell(), "Add Imported Package", getProjectModel(), null,
-            getBundle().getBundleInfo().getImports());
-
-        if (dialog.open() == Window.OK)
-        {
-            IPackageImport pi = ModelElementFactory.getInstance().newModelElement(
-                IPackageImport.class);
-            pi.setPackageName(dialog.getSelectedName());
-            pi.setVersions(dialog.getSelectedVersions());
-            pi.setOptional(dialog.isOptional());
-
-            getBundle().getBundleInfo().addImport(pi);
-            refresh();
-            markDirty();
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected void handleRemoved()
-    {
-        IStructuredSelection selection = (IStructuredSelection) getSelection();
-
-        if (!selection.isEmpty())
-        {
-            for (Iterator<IPackageImport> i = selection.iterator(); i.hasNext();)
-            {
-                getBundle().getBundleInfo().removeImport(i.next());
-            }
-
-            refresh();
-            markDirty();
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected void handleEdit()
-    {
-        IStructuredSelection selection = (IStructuredSelection) getSelection();
-
-        boolean changed = false;
-
-        if (!selection.isEmpty())
-        {
-            for (Iterator<IPackageImport> i = selection.iterator(); i.hasNext();)
-            {
-                IPackageImport packageImport = i.next();
-                NewResourceSelectionDialog<? extends IPackageModelElement> dialog = ResourcesDialogHelper.createImportDialog(
-                    getSection().getShell(), "Edit Imported Package", getProjectModel(),
-                    packageImport, getBundle().getBundleInfo().getImports());
-                if (dialog.open() == Window.OK)
-                {
-                    changed = true;
-                    IPackageImport newImport = ModelElementFactory.getInstance().newModelElement(
-                        IPackageImport.class);
-                    newImport.setPackageName(dialog.getSelectedName());
-                    newImport.setVersions(dialog.getSelectedVersions());
-                    newImport.setOptional(dialog.isOptional());
-
-                    getBundle().getBundleInfo().removeImport(packageImport);
-                    getBundle().getBundleInfo().addImport(newImport);
-                }
-            }
-        }
-
-        if (changed)
-        {
-            refresh();
-            markDirty();
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/NewPackageExportDialog.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/NewPackageExportDialog.java
deleted file mode 100644
index b6aeb1d..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/NewPackageExportDialog.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.Comparator;
-
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.apache.felix.sigil.eclipse.ui.util.BackgroundLoadingSelectionDialog;
-import org.apache.felix.sigil.eclipse.ui.util.IElementDescriptor;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.osgi.framework.Version;
-
-public class NewPackageExportDialog extends BackgroundLoadingSelectionDialog<IPackageFragment>
-{
-
-    private static final IElementDescriptor<IPackageFragment> PKG_FRAGMENT_STRINGIFIER = new IElementDescriptor<IPackageFragment>()
-    {
-        public String getLabel(IPackageFragment element)
-        {
-            return getName(element);
-        }
-
-        public String getName(IPackageFragment element)
-        {
-            return element.getElementName();
-        }
-    };
-
-    private static final Comparator<IPackageFragment> PKG_FRAGMENT_COMPARATOR = new Comparator<IPackageFragment>()
-    {
-        public int compare(IPackageFragment o1, IPackageFragment o2)
-        {
-            return o1.getElementName().compareTo(o2.getElementName());
-        }
-    };
-
-    private Version version = null;
-    private String error = null;
-    private Version projectVersion = VersionTable.getVersion(0, 0, 0);
-
-    private Button btnInheritBundleVersion;
-    private Button btnExplicitVersion;
-    private Text txtVersion;
-
-    public NewPackageExportDialog(Shell parentShell, boolean multiSelect)
-    {
-        super(parentShell, "Package:", multiSelect);
-        setDescriptor(PKG_FRAGMENT_STRINGIFIER);
-        setComparator(PKG_FRAGMENT_COMPARATOR);
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent)
-    {
-        // Create controls
-        Composite container = (Composite) super.createDialogArea(parent);
-        Composite composite = new Composite(container, SWT.NONE);
-
-        Group grpVersion = new Group(composite, SWT.NONE);
-        grpVersion.setText("Version");
-
-        btnInheritBundleVersion = new Button(grpVersion, SWT.RADIO);
-        btnInheritBundleVersion.setText("Inherit bundle version");
-        new Label(grpVersion, SWT.NONE); // Spacer
-        btnExplicitVersion = new Button(grpVersion, SWT.RADIO);
-        btnExplicitVersion.setText("Fixed version:");
-        txtVersion = new Text(grpVersion, SWT.BORDER);
-
-        // Initialize
-        if (version == null)
-        {
-            btnInheritBundleVersion.setSelection(true);
-            txtVersion.setEnabled(false);
-            txtVersion.setText(projectVersion.toString());
-        }
-        else
-        {
-            btnExplicitVersion.setSelection(true);
-            txtVersion.setEnabled(true);
-            txtVersion.setText(version.toString());
-        }
-        updateButtons();
-
-        // Listeners
-        Listener radioAndTextListener = new Listener()
-        {
-            public void handleEvent(Event event)
-            {
-                error = null;
-                if (btnInheritBundleVersion.getSelection())
-                {
-                    version = null;
-                    txtVersion.setEnabled(false);
-                }
-                else
-                {
-                    txtVersion.setEnabled(true);
-                    try
-                    {
-                        version = VersionTable.getVersion(txtVersion.getText());
-                    }
-                    catch (IllegalArgumentException e)
-                    {
-                        error = "Invalid version";
-                    }
-                }
-                setErrorMessage(error);
-                updateButtons();
-            }
-        };
-        txtVersion.addListener(SWT.Modify, radioAndTextListener);
-        btnInheritBundleVersion.addListener(SWT.Selection, radioAndTextListener);
-        btnExplicitVersion.addListener(SWT.Selection, radioAndTextListener);
-
-        // Layout
-        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        composite.setLayout(new GridLayout(1, false));
-        grpVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        grpVersion.setLayout(new GridLayout(2, false));
-        txtVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
-        return container;
-    }
-
-    @Override
-    protected boolean canComplete()
-    {
-        return super.canComplete() && error == null;
-    }
-
-    public void setProjectVersion(Version projectVersion)
-    {
-        this.projectVersion = projectVersion;
-    }
-
-    public void setVersion(Version version)
-    {
-        this.version = version;
-    }
-
-    public Version getVersion()
-    {
-        return version;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/NewResourceSelectionDialog.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/NewResourceSelectionDialog.java
deleted file mode 100644
index ab14e0e..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/NewResourceSelectionDialog.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.common.model.osgi.IVersionedModelElement;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.eclipse.model.util.ModelHelper;
-import org.apache.felix.sigil.eclipse.ui.util.BackgroundLoadingSelectionDialog;
-import org.apache.felix.sigil.eclipse.ui.util.IValidationListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.osgi.framework.Version;
-
-public class NewResourceSelectionDialog<E extends IVersionedModelElement> extends BackgroundLoadingSelectionDialog<E>
-{
-
-    private VersionRangeComponent pnlVersionRange;
-    private boolean optionalEnabled = true;
-    private Button btnOptional;
-
-    private VersionRange selectedVersions = null;
-    private boolean optional = false;
-
-    public NewResourceSelectionDialog(Shell parentShell, String selectionLabel, boolean multi)
-    {
-        super(parentShell, selectionLabel, multi);
-    }
-
-    public void setOptionalEnabled(boolean enabled)
-    {
-        optionalEnabled = enabled;
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent)
-    {
-        // Create controls
-        Composite container = (Composite) super.createDialogArea(parent);
-        Composite composite = new Composite(container, SWT.NONE);
-
-        if (optionalEnabled)
-        {
-            new Label(composite, SWT.NONE); //Spacer
-            btnOptional = new Button(composite, SWT.CHECK);
-            btnOptional.setText("Optional");
-        }
-
-        Label lblVersionRange = new Label(composite, SWT.NONE);
-        lblVersionRange.setText("Version Range:");
-        Group group = new Group(composite, SWT.BORDER);
-
-        pnlVersionRange = new VersionRangeComponent(group, SWT.NONE);
-
-        // Initialize
-        if (selectedVersions != null)
-        {
-            pnlVersionRange.setVersions(selectedVersions);
-        }
-
-        if (optionalEnabled)
-        {
-            btnOptional.setSelection(optional);
-            updateButtons();
-        }
-
-        // Hookup Listeners
-        pnlVersionRange.addVersionChangeListener(new VersionsChangeListener()
-        {
-            public void versionsChanged(VersionRange range)
-            {
-                selectedVersions = range;
-                updateButtons();
-            }
-        });
-        pnlVersionRange.addValidationListener(new IValidationListener()
-        {
-            public void validationMessage(String message, int level)
-            {
-                setMessage(message, level);
-                updateButtons();
-            }
-        });
-
-        if (optionalEnabled)
-        {
-            btnOptional.addSelectionListener(new SelectionAdapter()
-            {
-                public void widgetSelected(SelectionEvent e)
-                {
-                    optional = btnOptional.getSelection();
-                }
-            });
-        }
-
-        // Layout
-        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        GridLayout layout = new GridLayout(2, false);
-        layout.verticalSpacing = 10;
-        layout.horizontalSpacing = 10;
-        composite.setLayout(layout);
-
-        lblVersionRange.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
-        group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        group.setLayout(new FillLayout());
-
-        return container;
-    }
-
-    @Override
-    protected void elementSelected(E selection)
-    {
-        if (selection != null)
-        {
-            Version version = selection.getVersion();
-            selectedVersions = ModelHelper.getDefaultRange(version);
-            pnlVersionRange.setVersions(selectedVersions);
-        }
-    }
-
-    @Override
-    protected synchronized boolean canComplete()
-    {
-        return super.canComplete() && selectedVersions != null;
-    }
-
-    public VersionRange getSelectedVersions()
-    {
-        return selectedVersions;
-    }
-
-    public void setVersions(VersionRange versions)
-    {
-        selectedVersions = versions;
-        if (pnlVersionRange != null && !pnlVersionRange.isDisposed())
-        {
-            pnlVersionRange.setVersions(versions);
-            updateButtons();
-        }
-    }
-
-    public boolean isOptional()
-    {
-        return optional;
-    }
-
-    public void setOptional(boolean optional)
-    {
-        this.optional = optional;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/OverviewForm.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/OverviewForm.java
deleted file mode 100644
index aa061e0..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/OverviewForm.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.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-/**
- * @author dave
- *
- */
-public class OverviewForm extends SigilPage
-{
-    public static final String PAGE_ID = "overview";
-    private ISigilProjectModel sigil;
-
-    public OverviewForm(SigilProjectEditorPart editor, ISigilProjectModel sigil)
-    {
-        super(editor, PAGE_ID, "Overview");
-        this.sigil = sigil;
-    }
-
-    @Override
-    protected void createFormContent(IManagedForm managedForm)
-    {
-        FormToolkit toolkit = managedForm.getToolkit();
-
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Overview");
-
-        Composite body = form.getBody();
-        TableWrapLayout layout = new TableWrapLayout();
-        layout.bottomMargin = 10;
-        layout.topMargin = 5;
-        layout.leftMargin = 10;
-        layout.rightMargin = 10;
-        layout.numColumns = 2;
-        layout.horizontalSpacing = 10;
-        body.setLayout(layout);
-        body.setLayoutData(new TableWrapData(TableWrapData.FILL));
-
-        Composite left = toolkit.createComposite(body);
-        layout = new TableWrapLayout();
-        layout.verticalSpacing = 20;
-        left.setLayout(layout);
-        left.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-
-        Composite right = toolkit.createComposite(body);
-        layout = new TableWrapLayout();
-        layout.verticalSpacing = 20;
-        right.setLayout(layout);
-        right.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-
-        try
-        {
-            GeneralInfoSection general = new GeneralInfoSection(this, left, sigil);
-            managedForm.addPart(general);
-
-            ContentSummarySection content = new ContentSummarySection(this, right, sigil);
-            managedForm.addPart(content);
-
-            // XXX-FELIX
-            // commented out due to removal of runtime newton integration
-            // potential to bring back in medium term...
-            //TestingSection testing = new TestingSection(this, right, newton);
-            //managedForm.addPart(testing);
-
-            ToolsSection tools = new ToolsSection(this, right, sigil);
-            managedForm.addPart(tools);
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to create overview form", e);
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/PackageContentsSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/PackageContentsSection.java
deleted file mode 100644
index 6b1d186..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/PackageContentsSection.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilSection;
-import org.apache.felix.sigil.eclipse.ui.util.BackgroundLoadingSelectionDialog;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.apache.felix.sigil.eclipse.ui.util.IElementDescriptor;
-import org.apache.felix.sigil.eclipse.ui.util.IFilter;
-import org.apache.felix.sigil.eclipse.ui.util.ModelLabelProvider;
-import org.apache.felix.sigil.eclipse.ui.util.SelectionDialog;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-public class PackageContentsSection extends SigilSection
-{
-
-    private ProjectTableViewer viewer;
-//    private final Comparator<IClasspathEntry> CLASSPATH_COMPARATOR = new Comparator<IClasspathEntry>()
-//    {
-//        public int compare(IClasspathEntry o1, IClasspathEntry o2)
-//        {
-//            return compareClasspaths(o1, o2);
-//        }
-//    };
-
-    public PackageContentsSection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(page, parent, project);
-    }
-
-    @Override
-    protected void createSection(Section section, FormToolkit toolkit)
-    {
-        setTitle("Packages");
-
-        Composite body = createGridBody(2, false, toolkit);
-
-        Label label = toolkit.createLabel(body,
-            "Specify which packages should be included in this bundle.");
-        label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 2, 1));
-
-        Table bundleTable = toolkit.createTable(body, SWT.MULTI | SWT.FULL_SELECTION
-            | SWT.VIRTUAL | SWT.BORDER);
-        GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
-        tableLayoutData.heightHint = 150;
-        bundleTable.setLayoutData(tableLayoutData);
-
-        createButtons(body, toolkit);
-        createViewer(bundleTable);
-    }
-
-    private void createButtons(Composite body, FormToolkit toolkit)
-    {
-        Composite buttons = toolkit.createComposite(body);
-        TableWrapLayout layout = new TableWrapLayout();
-        layout.numColumns = 1;
-        layout.topMargin = 0;
-        layout.leftMargin = 0;
-        layout.rightMargin = 0;
-        layout.bottomMargin = 0;
-        buttons.setLayout(layout);
-
-        Button add = toolkit.createButton(buttons, "Add", SWT.NULL);
-        add.setLayoutData(new TableWrapData(TableWrapData.FILL));
-        add.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleAdd();
-            }
-        });
-
-        Button remove = toolkit.createButton(buttons, "Remove", SWT.NULL);
-        remove.setLayoutData(new TableWrapData(TableWrapData.FILL));
-        remove.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleRemoved();
-            }
-        });
-    }
-
-    private void createViewer(Table bundleTable)
-    {
-        viewer = new ProjectTableViewer(bundleTable);
-        viewer.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                // TODO sort?
-                return getBundle().getPackages().toArray(new String[0]);
-            }
-        });
-//        viewer.setComparator(new ViewerComparator()
-//        {
-//            @Override
-//            public int category(Object element)
-//            {
-//                return index((IClasspathEntry) element);
-//            }
-//        });
-    }
-
-    protected ISigilBundle getBundle()
-    {
-        return getProjectModel().getBundle();
-    }
-
-    private void handleAdd()
-    {
-//        try
-//        {
-//            SelectionDialog<E> dialog = new BackgroundLoadingSelectionDialog<IClasspathEntry>(
-//                getSection().getShell(), "Classpath Entry:", true);
-//
-//            dialog.setDescriptor(new IElementDescriptor<IClasspathEntry>()
-//            {
-//                public String getName(IClasspathEntry element)
-//                {
-//                    return element.getPath().toString();
-//                }
-//
-//                public String getLabel(IClasspathEntry element)
-//                {
-//                    return getName(element);
-//                }
-//            });
-//
-//            dialog.setLabelProvider(new ModelLabelProvider());
-//
-//            dialog.setFilter(new IFilter<IClasspathEntry>()
-//            {
-//                public boolean select(IClasspathEntry cp)
-//                {
-//                    switch (cp.getEntryKind())
-//                    {
-//                        case IClasspathEntry.CPE_LIBRARY:
-//                        case IClasspathEntry.CPE_VARIABLE:
-//                        case IClasspathEntry.CPE_SOURCE:
-//                            return !getBundle().getClasspathEntrys().contains(encode(cp));
-//                        default:
-//                            return false;
-//                    }
-//                }
-//            });
-//
-//            dialog.setComparator(CLASSPATH_COMPARATOR);
-//
-//            IClasspathEntry[] classpath = getProjectModel().getJavaModel().getRawClasspath();
-//            dialog.addElements(Arrays.asList(classpath));
-//            if (dialog.open() == Window.OK)
-//            {
-//                List<IClasspathEntry> selectedElements = dialog.getSelectedElements();
-//
-//                Object[] added = selectedElements.toArray();
-//                for (IClasspathEntry entry : selectedElements)
-//                {
-//                    getBundle().addClasspathEntry(encode(entry));
-//                }
-//                viewer.add(added);
-//                viewer.refresh();
-//                markDirty();
-//            }
-//        }
-//        catch (JavaModelException e)
-//        {
-//            ErrorDialog.openError(getSection().getShell(), "Error", null, e.getStatus());
-//        }
-    }
-
-//    private int compareClasspaths(IClasspathEntry o1, IClasspathEntry o2)
-//    {
-//        if (o1.getEntryKind() == o2.getEntryKind())
-//        {
-//            ModelLabelProvider mlp = viewer.getLabelProvider();
-//            return mlp.getText(o1).compareTo(mlp.getText(o2));
-//        }
-//        else
-//        {
-//            int i1 = index(o1);
-//            int i2 = index(o2);
-//
-//            if (i1 < i2)
-//            {
-//                return -1;
-//            }
-//            else
-//            {
-//                return 1;
-//            }
-//        }
-//    }
-
-//    private static int index(IClasspathEntry o1)
-//    {
-//        switch (o1.getEntryKind())
-//        {
-//            case IClasspathEntry.CPE_SOURCE:
-//                return 0;
-//            case IClasspathEntry.CPE_PROJECT:
-//                return 1;
-//            case IClasspathEntry.CPE_LIBRARY:
-//                return 2;
-//            case IClasspathEntry.CPE_VARIABLE:
-//                return 3;
-//            case IClasspathEntry.CPE_CONTAINER:
-//                return 4;
-//            default:
-//                throw new IllegalStateException("Unknown classpath entry type " + o1);
-//        }
-//    }
-
-//    private String encode(IClasspathEntry cp)
-//    {
-//        return getProjectModel().getJavaModel().encodeClasspathEntry(cp).trim();
-//    }
-
-    @SuppressWarnings("unchecked")
-    private void handleRemoved()
-    {
-        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-
-        if (!selection.isEmpty())
-        {
-            for (Iterator<String> i = selection.iterator(); i.hasNext();)
-            {
-                getBundle().removePackage(i.next());
-            }
-            viewer.remove(selection.toArray());
-            markDirty();
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/PackageExportDialog.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/PackageExportDialog.java
deleted file mode 100644
index b44eb5f..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/PackageExportDialog.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.osgi.framework.Version;
-
-public class PackageExportDialog extends ResourceSelectDialog
-{
-
-    private Text versionText;
-    private Version version;
-
-    public PackageExportDialog(Shell parentShell, String title, IContentProvider content, ViewerFilter filter, Object scope)
-    {
-        super(parentShell, content, filter, scope, title, "Package Name:", true);
-    }
-
-    @Override
-    protected void createCustom(Composite body)
-    {
-        Label l = new Label(body, SWT.NONE);
-        l.setText("Version:");
-        versionText = new Text(body, SWT.BORDER);
-        versionText.addKeyListener(new KeyAdapter()
-        {
-            @Override
-            public void keyReleased(KeyEvent e)
-            {
-                try
-                {
-                    version = VersionTable.getVersion(versionText.getText());
-                    setErrorMessage(null);
-                }
-                catch (IllegalArgumentException ex)
-                {
-                    setErrorMessage("Invalid version");
-                }
-            }
-        });
-        if (version != null)
-        {
-            versionText.setText(version.toString());
-        }
-    }
-
-    public Version getVersion()
-    {
-        return version;
-    }
-
-    public void setVersion(Version version)
-    {
-        this.version = version;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ProjectLabelProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ProjectLabelProvider.java
deleted file mode 100644
index e90b342..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ProjectLabelProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.io.InputStream;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultLabelProvider;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.widgets.Widget;
-
-public class ProjectLabelProvider extends DefaultLabelProvider implements IBaseLabelProvider
-{
-
-    private final Widget parent;
-    private final ImageRegistry registry;
-    private final IDependencyChecker checker;
-
-    public ProjectLabelProvider(Widget parent, ImageRegistry registry)
-    {
-        this(parent, registry, null);
-    }
-
-    public ProjectLabelProvider(Widget parent, ImageRegistry registry, IDependencyChecker checker)
-    {
-        this.parent = parent;
-        this.registry = registry;
-        this.checker = checker;
-    }
-
-    public Image getImage(Object element)
-    {
-        Image result = null;
-        if (element instanceof ISigilBundle || element instanceof IRequiredBundle
-            || element instanceof IBundleModelElement)
-        {
-            result = findBundle();
-        }
-        else if (element instanceof IPackageImport)
-        {
-            if (checker != null)
-            {
-                result = checker.isSatisfied((IPackageImport) element) ? findPackage()
-                    : findPackageError();
-            }
-            else
-            {
-                result = findPackage();
-            }
-        }
-        else if (element instanceof IPackageExport)
-        {
-            result = findPackage();
-        }
-        else if (element instanceof IPackageFragmentRoot)
-        {
-            IPackageFragmentRoot root = (IPackageFragmentRoot) element;
-            try
-            {
-                if (root.getKind() == IPackageFragmentRoot.K_SOURCE)
-                {
-                    result = findPackage();
-                }
-                else
-                {
-                    result = findBundle();
-                }
-            }
-            catch (JavaModelException e)
-            {
-                SigilCore.error("Failed to inspect package fragment root", e);
-            }
-        }
-        else if (element instanceof IClasspathEntry)
-        {
-            result = findPackage();
-        }
-
-        return result;
-    }
-
-    public String getText(Object element)
-    {
-        if (element instanceof ISigilBundle)
-        {
-            ISigilBundle bundle = (ISigilBundle) element;
-            return bundle.getBundleInfo().getSymbolicName();
-        }
-
-        if (element instanceof IRequiredBundle)
-        {
-            IRequiredBundle req = (IRequiredBundle) element;
-            return req.getSymbolicName() + " " + req.getVersions();
-        }
-
-        if (element instanceof IPackageImport)
-        {
-            IPackageImport req = (IPackageImport) element;
-            return req.getPackageName() + " " + req.getVersions();
-        }
-
-        if (element instanceof IPackageExport)
-        {
-            IPackageExport pe = (IPackageExport) element;
-            return pe.getPackageName() + " " + pe.getVersion();
-        }
-
-        if (element instanceof IResource)
-        {
-            IResource resource = (IResource) element;
-            return resource.getName();
-        }
-
-        if (element instanceof IPackageFragment)
-        {
-            IPackageFragment f = (IPackageFragment) element;
-            return f.getElementName();
-        }
-
-        if (element instanceof IPackageFragmentRoot)
-        {
-            IPackageFragmentRoot f = (IPackageFragmentRoot) element;
-            try
-            {
-                return f.getUnderlyingResource().getName();
-            }
-            catch (JavaModelException e)
-            {
-                return "unknown";
-            }
-        }
-
-        if (element instanceof IClasspathEntry)
-        {
-            IClasspathEntry cp = (IClasspathEntry) element;
-            return cp.getPath().toString();
-        }
-
-        return element.toString();
-    }
-
-    private Image findPackage()
-    {
-        Image image = registry.get("package");
-
-        if (image == null)
-        {
-            image = loadImage("icons/package_obj.png");
-            registry.put("package", image);
-        }
-
-        return image;
-    }
-
-    private Image findPackageError()
-    {
-        Image image = registry.get("package_error");
-        if (image == null)
-        {
-            image = loadImage("icons/package_obj_error.gif");
-            registry.put("package_error", image);
-        }
-        return image;
-    }
-
-    private Image findBundle()
-    {
-        Image image = registry.get("bundle");
-
-        if (image == null)
-        {
-            image = loadImage("icons/jar_obj.png");
-            registry.put("bundle", image);
-        }
-
-        return image;
-    }
-
-    private Image loadImage(String resource)
-    {
-        InputStream in = ProjectLabelProvider.class.getClassLoader().getResourceAsStream(
-            resource);
-        ImageData data = new ImageData(in);
-        return new Image(parent.getDisplay(), data);
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ProjectTableViewer.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ProjectTableViewer.java
deleted file mode 100644
index 674ea0e..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ProjectTableViewer.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.eclipse.ui.util.ModelLabelProvider;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.widgets.Table;
-
-public class ProjectTableViewer extends TableViewer
-{
-
-    private ModelLabelProvider labelProvider;
-
-    public ProjectTableViewer(Table table)
-    {
-        super(table);
-        labelProvider = new ModelLabelProvider();
-        setLabelProvider(labelProvider);
-    }
-
-    @Override
-    public void setContentProvider(IContentProvider provider)
-    {
-        super.setContentProvider(provider);
-        setInput(getTable());
-    }
-
-    public void setUnresolvedElements(Set<? extends IModelElement> elements)
-    {
-        labelProvider.setUnresolvedElements(elements);
-    }
-
-    @Override
-    public ModelLabelProvider getLabelProvider()
-    {
-        return labelProvider;
-    }
-
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/PropertiesForm.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/PropertiesForm.java
deleted file mode 100644
index 8662fef..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/PropertiesForm.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.propertiesfileeditor.IPropertiesFilePartitions;
-import org.eclipse.jdt.internal.ui.propertiesfileeditor.PropertiesFileSourceViewerConfiguration;
-import org.eclipse.jdt.ui.text.JavaTextTools;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-@SuppressWarnings("restriction")
-public class PropertiesForm extends SigilSourcePage
-{
-
-    public static final String PAGE_ID = "properties";
-
-    public PropertiesForm(SigilProjectEditorPart editor, ISigilProjectModel project)
-    {
-        super(PAGE_ID);
-        JavaTextTools textTools = JavaPlugin.getDefault().getJavaTextTools();
-        IPreferenceStore store = JavaPlugin.getDefault().getCombinedPreferenceStore();
-        setPreferenceStore(store);
-        setSourceViewerConfiguration(new PropertiesFileSourceViewerConfiguration(
-            textTools.getColorManager(), store, this,
-            IPropertiesFilePartitions.PROPERTIES_FILE_PARTITIONING));
-        /*IFileEditorInput fileInput = (IFileEditorInput) editor.getEditorInput();
-        this.setDocumentProvider(fileInput);*/
-    }
-
-    @Override
-    public boolean isSaveAsAllowed()
-    {
-        return false;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/RequiresBundleSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/RequiresBundleSection.java
deleted file mode 100644
index 400795e..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/RequiresBundleSection.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.Iterator;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.ModelElementFactoryException;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.apache.felix.sigil.eclipse.ui.util.ResourcesDialogHelper;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-public class RequiresBundleSection extends BundleDependencySection
-{
-
-    public RequiresBundleSection(SigilPage page, Composite parent, ISigilProjectModel project, Set<IModelElement> unresolvedElements) throws CoreException
-    {
-        super(page, parent, project, unresolvedElements);
-    }
-
-    @Override
-    protected String getTitle()
-    {
-        return "Requires Bundles";
-    }
-
-    @Override
-    protected Label createLabel(Composite parent, FormToolkit toolkit)
-    {
-        return toolkit.createLabel(parent,
-            "Specify which bundles this bundle depends on.");
-    }
-
-    @Override
-    protected IContentProvider getContentProvider()
-    {
-        return new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return getBundle().getBundleInfo().getRequiredBundles().toArray();
-            }
-        };
-    }
-
-    protected ISigilBundle getBundle()
-    {
-        return getProjectModel().getBundle();
-    }
-
-    @Override
-    protected void handleAdd()
-    {
-        try
-        {
-            NewResourceSelectionDialog<IBundleModelElement> dialog = ResourcesDialogHelper.createRequiredBundleDialog(
-                getSection().getShell(), "Add Required Bundle", getProjectModel(), null,
-                getBundle().getBundleInfo().getRequiredBundles());
-
-            if (dialog.open() == Window.OK)
-            {
-                IRequiredBundle required = ModelElementFactory.getInstance().newModelElement(
-                    IRequiredBundle.class);
-                required.setSymbolicName(dialog.getSelectedName());
-                required.setVersions(dialog.getSelectedVersions());
-                required.setOptional(dialog.isOptional());
-
-                getBundle().getBundleInfo().addRequiredBundle(required);
-                refresh();
-                markDirty();
-            }
-        }
-        catch (ModelElementFactoryException e)
-        {
-            SigilCore.error("Failed to build required bundle", e);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected void handleEdit()
-    {
-        IStructuredSelection selection = (IStructuredSelection) getSelection();
-
-        boolean changed = false;
-
-        if (!selection.isEmpty())
-        {
-            for (Iterator<IRequiredBundle> i = selection.iterator(); i.hasNext();)
-            {
-                IRequiredBundle requiredBundle = i.next();
-                NewResourceSelectionDialog<IBundleModelElement> dialog = ResourcesDialogHelper.createRequiredBundleDialog(
-                    getSection().getShell(), "Edit Imported Package", getProjectModel(),
-                    requiredBundle, getBundle().getBundleInfo().getRequiredBundles());
-                if (dialog.open() == Window.OK)
-                {
-                    changed = true;
-                    requiredBundle.setSymbolicName(dialog.getSelectedName());
-                    requiredBundle.setVersions(dialog.getSelectedVersions());
-                    requiredBundle.setOptional(dialog.isOptional());
-                }
-            }
-        }
-
-        if (changed)
-        {
-            refresh();
-            markDirty();
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected void handleRemoved()
-    {
-        IStructuredSelection selection = (IStructuredSelection) getSelection();
-
-        if (!selection.isEmpty())
-        {
-            for (Iterator<IRequiredBundle> i = selection.iterator(); i.hasNext();)
-            {
-                getBundle().getBundleInfo().removeRequiredBundle(i.next());
-            }
-
-            refresh();
-            markDirty();
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ResourceBuildSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ResourceBuildSection.java
deleted file mode 100644
index 3f1763a..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ResourceBuildSection.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.apache.felix.sigil.common.config.Resource;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.model.BaseWorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * @author dave
- *
- */
-public class ResourceBuildSection extends AbstractResourceSection implements ICheckStateListener, IResourceChangeListener, IPropertyChangeListener
-{
-
-    private ExcludedResourcesFilter resourcesFilter;
-
-    /**
-     * @param page
-     * @param parent
-     * @param project
-     * @throws CoreException 
-     */
-    public ResourceBuildSection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(page, parent, project);
-    }
-
-    @Override
-    protected void createSection(Section section, FormToolkit toolkit)
-    {
-        setTitle("Resources");
-
-        Composite body = createTableWrapBody(1, toolkit);
-
-        toolkit.createLabel(body, "Specify which resources are included in the bundle.");
-
-        tree = toolkit.createTree(body, SWT.CHECK | SWT.BORDER);
-        Link link = new Link(body, SWT.WRAP);
-        link.setText("Some resources may be filtered according to preferences. <a href=\"excludedResourcePrefs\">Click here</a> to edit the list of exclusions.");
-
-        TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
-        data.heightHint = 200;
-        tree.setLayoutData(data);
-
-        viewer = new CheckboxTreeViewer(tree);
-        IProject base = getProjectModel().getProject();
-        viewer.setContentProvider(new BaseWorkbenchContentProvider());
-        viewer.setLabelProvider(new WorkbenchLabelProvider());
-        viewer.addCheckStateListener(this);
-        resourcesFilter = new ExcludedResourcesFilter();
-        viewer.addFilter(resourcesFilter);
-        viewer.setInput(base);
-
-        link.addListener(SWT.Selection, new Listener()
-        {
-            public void handleEvent(Event event)
-            {
-                if ("excludedResourcePrefs".equals(event.text))
-                {
-                    PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(
-                        getPage().getEditorSite().getShell(),
-                        SigilCore.EXCLUDED_RESOURCES_PREFERENCES_ID, null, null);
-                    dialog.open();
-                }
-            }
-        });
-
-        SigilCore.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-
-        startWorkspaceListener(base.getWorkspace());
-    }
-
-    @Override
-    public void commit(boolean onSave)
-    {
-        ISigilBundle bundle = getProjectModel().getBundle();
-
-        bundle.clearSourcePaths();
-
-        try
-        {
-            SigilUI.runInUISync(new Callable<Void>()
-            {
-                public Void call() throws Exception
-                {
-                    for (Object o : viewer.getCheckedElements())
-                    {
-                        if (!viewer.getGrayed(o))
-                        {
-                            IResource r = (IResource) o;
-
-                            getProjectModel().getBundle().addSourcePath(toBldResource(r));
-                        }
-                    }
-
-                    return null;
-                }
-            });
-
-            super.commit(onSave);
-        }
-        catch (Exception e)
-        {
-            SigilCore.warn("Failed to update resource", e);
-        }
-    }
-
-    @Override
-    protected void refreshSelections()
-    {
-        // zero the state
-        for (Resource path : getProjectModel().getBundle().getSourcePaths())
-        {
-            IResource r = findResource(new Path(path.getLocalFile()));
-            if (r != null)
-            {
-                viewer.expandToLevel(r, 0);
-                viewer.setChecked(r, true);
-                viewer.setGrayed(r, false);
-                handleStateChanged(r, true, false, false);
-            }
-            else
-            {
-                SigilCore.error("Unknown path " + path);
-            }
-        }
-    }
-
-    @Override
-    protected void syncResourceModel(IResource element, boolean checked)
-    {
-        try
-        {
-            Resource resource = toBldResource(element);
-
-            if (checked)
-            {
-                getProjectModel().getBundle().addSourcePath(resource);
-            }
-            else
-            {
-                getProjectModel().getBundle().removeSourcePath(resource);
-            }
-
-            markDirty();
-        }
-        catch (CoreException e)
-        {
-            SigilCore.warn("Failed to sync resource " + element, e);
-        }
-    }
-
-    /**
-     * @param element
-     * @return
-     * @throws CoreException 
-     */
-    private Resource toBldResource(IResource element) throws CoreException
-    {
-        return getProjectModel().getBldProject().newResource(
-            element.getProjectRelativePath().toString());
-    }
-
-    private AtomicBoolean disposed = new AtomicBoolean();
-
-    @Override
-    public void dispose()
-    {
-        disposed.set(true);
-        SigilCore.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-        super.dispose();
-    }
-
-    public void propertyChange(PropertyChangeEvent event)
-    {
-        if (!disposed.get())
-        {
-            resourcesFilter.loadExclusions();
-            try
-            {
-                viewer.refresh();
-            }
-            catch (SWTException e)
-            {
-                // can happen on dispose
-            }
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ResourceImportDialog.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ResourceImportDialog.java
deleted file mode 100644
index e667941..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ResourceImportDialog.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-public class ResourceImportDialog extends ResourceSelectDialog implements VersionsChangeListener
-{
-
-    private VersionRangeComponent versions;
-    private VersionRange range;
-
-    public ResourceImportDialog(Shell parentShell, String title, String label, IContentProvider content, ViewerFilter filter, Object scope)
-    {
-        super(parentShell, content, filter, scope, title, label, true);
-    }
-
-    public VersionRange getVersions()
-    {
-        return range;
-    }
-
-    @Override
-    protected void createCustom(Composite body)
-    {
-        versions = new VersionRangeComponent(body, SWT.BORDER);
-        versions.addVersionChangeListener(this);
-        versions.setVersions(range);
-
-        GridData data = new GridData(SWT.LEFT, SWT.TOP, true, true);
-        data.horizontalSpan = 2;
-        data.widthHint = 300;
-        data.heightHint = 200;
-        versions.setLayoutData(data);
-    }
-
-    @Override
-    protected void selectionChanged(SelectionChangedEvent event)
-    {
-        if (event.getSelection().isEmpty())
-        {
-            versions.setEnabled(false);
-        }
-        else
-        {
-            versions.setEnabled(true);
-        }
-    }
-
-    public void versionsChanged(VersionRange range)
-    {
-        this.range = range;
-        if (range == null)
-        {
-            setErrorMessage("Invalid version");
-        }
-        else
-        {
-            setErrorMessage(null);
-        }
-    }
-
-    public void setVersions(VersionRange range)
-    {
-        this.range = range;
-    }
-
-    public IPackageImport getImport()
-    {
-        IPackageImport packageImport = ModelElementFactory.getInstance().newModelElement(
-            IPackageImport.class);
-        packageImport.setPackageName((String) getSelected()[0]);
-        packageImport.setVersions(getVersions());
-        return packageImport;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ResourceSelectDialog.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ResourceSelectDialog.java
deleted file mode 100644
index 7b7740a..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ResourceSelectDialog.java
+++ /dev/null
@@ -1,438 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.felix.sigil.eclipse.ui.util.ModelLabelProvider;
-import org.apache.felix.sigil.eclipse.ui.util.SingletonSelection;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.StringConverter;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-
-public class ResourceSelectDialog extends Dialog
-{
-
-    private AtomicInteger keyCheck = new AtomicInteger();
-    private ScheduledExecutorService background = Executors.newSingleThreadScheduledExecutor();
-
-    private class UpdateViewerRunnable implements Runnable
-    {
-        private int check;
-
-        public UpdateViewerRunnable(int check)
-        {
-            this.check = check;
-        }
-
-        public void run()
-        {
-            if (check == keyCheck.get())
-            {
-                try
-                {
-                    viewer.refresh();
-                }
-                catch (SWTException e)
-                {
-                    // discard
-                }
-            }
-        }
-    }
-
-    private static final ISelection EMPTY_SELECTION = new ISelection()
-    {
-        public boolean isEmpty()
-        {
-            return true;
-        }
-    };
-
-    private Job job;
-
-    private boolean isCombo;
-    private String title;
-    private String selectionText;
-
-    private StructuredViewer viewer;
-    private Combo resourceNameCombo;
-    private Table resourceNameTable;
-    private Text errorMessageText;
-    private String errorMessage;
-
-    private ViewerFilter filter;
-    private Object[] selected;
-
-    private Object scope;
-    private IContentProvider content;
-    private ILabelProvider labelProvider;
-
-    public ResourceSelectDialog(Shell parentShell, IContentProvider content, ViewerFilter filter, Object scope, String title, String selectionText, boolean isCombo)
-    {
-        super(parentShell);
-        this.title = title;
-        this.selectionText = selectionText;
-        this.content = content;
-        this.filter = filter;
-        this.scope = scope;
-        this.isCombo = isCombo;
-    }
-
-    public void setJob(Job job)
-    {
-        this.job = job;
-    }
-
-    public void refreshResources()
-    {
-        try
-        {
-            getShell().getDisplay().asyncExec(new Runnable()
-            {
-                public void run()
-                {
-                    try
-                    {
-                        viewer.refresh();
-                    }
-                    catch (SWTException e)
-                    {
-                        // attempt to exec after dialog closed - discard
-                    }
-                }
-            });
-        }
-        catch (NullPointerException e)
-        {
-            // attempt to exec after dialog closed - discard
-        }
-        catch (SWTException e)
-        {
-            // attempt to exec after dialog closed - discard
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-     */
-    protected void configureShell(Shell shell)
-    {
-        super.configureShell(shell);
-        if (title != null)
-        {
-            shell.setText(title);
-        }
-    }
-
-    @Override
-    public void create()
-    {
-        super.create();
-        if (getItemCount() == 0)
-        {
-            setErrorMessage("No resources available");
-            getButton(IDialogConstants.OK_ID).setEnabled(false);
-        }
-        else
-        {
-            ISelection selection = selected == null ? EMPTY_SELECTION
-                : new SingletonSelection(selected);
-            setSelected(new SelectionChangedEvent(viewer, selection), true);
-        }
-
-        if (job != null)
-        {
-            job.schedule();
-        }
-    }
-
-    @Override
-    public boolean close()
-    {
-        if (job != null)
-        {
-            job.cancel();
-        }
-        background.shutdownNow();
-        return super.close();
-    }
-
-    private int getItemCount()
-    {
-        if (isCombo)
-        {
-            return resourceNameCombo.getItemCount();
-        }
-        else
-        {
-            return resourceNameTable.getItemCount();
-        }
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent)
-    {
-        Composite body = (Composite) super.createDialogArea(parent);
-
-        GridLayout layout = (GridLayout) body.getLayout();
-        layout.numColumns = 2;
-        GridData data;
-
-        labelProvider = new ModelLabelProvider();
-
-        Label l = new Label(body, SWT.LEFT);
-        l.setText(selectionText);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-        if (!isCombo)
-        {
-            data.horizontalSpan = 2;
-        }
-        l.setLayoutData(data);
-
-        if (isCombo)
-        {
-            createCombo(body);
-        }
-        else
-        {
-            createTable(body);
-        }
-
-        viewer.addFilter(filter);
-        viewer.setContentProvider(content);
-        viewer.setLabelProvider(getLabelProvider());
-        viewer.setComparator(new ViewerComparator());
-        viewer.setInput(scope);
-
-        viewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                setSelected(event, false);
-            }
-        });
-        createCustom(body);
-
-        errorMessageText = new Text(body, SWT.READ_ONLY | SWT.WRAP);
-        data = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
-        data.horizontalSpan = 2;
-        errorMessageText.setLayoutData(data);
-        errorMessageText.setBackground(errorMessageText.getDisplay().getSystemColor(
-            SWT.COLOR_WIDGET_BACKGROUND));
-        setErrorMessage(errorMessage);
-
-        return body;
-    }
-
-    protected void createCustom(Composite body)
-    {
-    }
-
-    private void createCombo(Composite body)
-    {
-        resourceNameCombo = new Combo(body, SWT.SINGLE | SWT.BORDER);
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-        data.widthHint = 200;
-        resourceNameCombo.setLayoutData(data);
-
-        viewer = new ComboViewer(resourceNameCombo);
-    }
-
-    private void createTable(Composite body)
-    {
-        final Text txtFilter = new Text(body, SWT.BORDER);
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-        data.horizontalSpan = 2;
-        data.widthHint = 400;
-        txtFilter.setLayoutData(data);
-
-        resourceNameTable = new Table(body, SWT.MULTI | SWT.BORDER);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-        data.widthHint = 400;
-        data.heightHint = 400;
-        resourceNameTable.setLayoutData(data);
-
-        viewer = new TableViewer(resourceNameTable);
-
-        txtFilter.addKeyListener(new KeyAdapter()
-        {
-            @Override
-            public void keyReleased(KeyEvent e)
-            {
-                switch (e.keyCode)
-                {
-                    case SWT.ARROW_UP:
-                        scrollTable(-1);
-                        break;
-                    case SWT.ARROW_DOWN:
-                        scrollTable(+1);
-                        break;
-                    default:
-                        Runnable r = new UpdateViewerRunnable(keyCheck.incrementAndGet());
-                        background.schedule(r, 100, TimeUnit.MILLISECONDS);
-                        break;
-                }
-            }
-        });
-
-        ViewerFilter filter = new ViewerFilter()
-        {
-            @Override
-            public boolean select(Viewer viewer, Object parentElement, Object element)
-            {
-                return getLabelProvider().getText(element).startsWith(txtFilter.getText());
-            }
-        };
-
-        viewer.addFilter(filter);
-    }
-
-    private void scrollTable(int delta)
-    {
-        int i = resourceNameTable.getSelectionIndex();
-
-        if (i == -1)
-        {
-            if (delta < 0)
-            {
-                i = resourceNameTable.getItemCount() - 1;
-            }
-            else
-            {
-                i = 0;
-            }
-        }
-        else
-        {
-            i += delta;
-        }
-
-        if (i > -1 && i < resourceNameTable.getItemCount())
-        {
-            Item item = resourceNameTable.getItem(i);
-            resourceNameTable.select(i);
-            selected = new Object[] { item.getData() };
-            ISelection selection = new SingletonSelection(selected);
-            selectionChanged(new SelectionChangedEvent(viewer, selection));
-            viewer.reveal(selected);
-        }
-    }
-
-    private void setSelected(SelectionChangedEvent event, boolean reveal)
-    {
-        if (event.getSelection().isEmpty())
-        {
-            selected = null;
-            setErrorMessage("No resource selected");
-        }
-        else
-        {
-            selected = ((IStructuredSelection) event.getSelection()).toArray();
-            setErrorMessage(null);
-        }
-
-        selectionChanged(event);
-
-        if (reveal && !event.getSelection().isEmpty())
-        {
-            if (resourceNameCombo != null)
-            {
-                IStructuredSelection sel = (IStructuredSelection) event.getSelection();
-                resourceNameCombo.select(resourceNameCombo.indexOf((String) sel.getFirstElement()));
-            }
-            else
-            {
-                viewer.setSelection(event.getSelection(), true);
-            }
-        }
-    }
-
-    protected ILabelProvider getLabelProvider()
-    {
-        return labelProvider;
-    }
-
-    public Object[] getSelected()
-    {
-        return selected;
-    }
-
-    public void setSelected(Object[] selected)
-    {
-        this.selected = selected;
-    }
-
-    protected void selectionChanged(SelectionChangedEvent event)
-    {
-    }
-
-    public void setErrorMessage(String errorMessage)
-    {
-        this.errorMessage = errorMessage;
-        if (errorMessageText != null && !errorMessageText.isDisposed())
-        {
-            errorMessageText.setText(errorMessage == null ? " \n " : errorMessage);
-            boolean hasError = errorMessage != null
-                && (StringConverter.removeWhiteSpaces(errorMessage)).length() > 0;
-            errorMessageText.setEnabled(hasError);
-            errorMessageText.setVisible(hasError);
-            errorMessageText.getParent().update();
-            Control ok = getButton(IDialogConstants.OK_ID);
-            if (ok != null)
-            {
-                ok.setEnabled(!hasError);
-            }
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/SigilProjectEditorPart.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/SigilProjectEditorPart.java
deleted file mode 100644
index aa05156..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/SigilProjectEditorPart.java
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IFormPart;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.IFormPage;
-
-public class SigilProjectEditorPart extends FormEditor implements IResourceChangeListener
-{
-
-    private final Set<IModelElement> unresolvedElements = Collections.synchronizedSet(new HashSet<IModelElement>());
-    private ISigilProjectModel project;
-    private ISigilProjectModel tempProject;
-    private volatile boolean saving = false;
-    private int dependenciesPageIndex;
-
-    private Image errorImage = PlatformUI.getWorkbench().getSharedImages().getImage(
-        ISharedImages.IMG_OBJS_ERROR_TSK);
-
-    private PropertiesForm textPage;
-
-    public IProject getProject()
-    {
-        IFileEditorInput fileInput = (IFileEditorInput) getEditorInput();
-        return fileInput.getFile().getProject();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-     */
-    @Override
-    public void doSave(IProgressMonitor monitor)
-    {
-        monitor.beginTask("Saving", IProgressMonitor.UNKNOWN);
-        try
-        {
-            saving = true;
-            new ProgressMonitorDialog(getSite().getShell()).run(true, true,
-                new IRunnableWithProgress()
-                {
-                    public void run(IProgressMonitor monitor)
-                        throws InvocationTargetException, InterruptedException
-                    {
-                        try
-                        {
-                            if (doInternalSave(monitor))
-                            {
-                                project.setBundle(null);
-                                tempProject.setBundle(null);
-                                project.rebuildDependencies(monitor);
-                                refreshAllPages();
-                            }
-
-                            monitor.done();
-                        }
-                        catch (CoreException e)
-                        {
-                            throw new InvocationTargetException(e);
-                        }
-                    }
-                });
-        }
-        catch (InvocationTargetException e)
-        {
-            SigilCore.error("Failed to save " + project, e.getTargetException());
-        }
-        catch (InterruptedException e)
-        {
-            monitor.setCanceled(true);
-            return;
-        }
-        finally
-        {
-            saving = false;
-        }
-        monitor.done();
-    }
-
-    private boolean doInternalSave(final IProgressMonitor monitor) throws CoreException
-    {
-        if (textPage.isDirty())
-        {
-            SigilUI.runInUISync(new Runnable()
-            {
-                public void run()
-                {
-                    textPage.doSave(monitor);
-                }
-            });
-            return true;
-        }
-        else if (isDirty())
-        {
-            commitPages(true);
-            tempProject.save(monitor, false);
-            SigilUI.runInUISync(new Runnable()
-            {
-                public void run()
-                {
-                    textPage.setInput(getEditorInput());
-                    editorDirtyStateChanged();
-                }
-            });
-            return true;
-        }
-
-        // ok no changes
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
-     */
-    @Override
-    protected void addPages()
-    {
-        try
-        {
-            addPage(new OverviewForm(this, tempProject));
-            addPage(new ContentsForm(this, tempProject));
-            dependenciesPageIndex = addPage(new DependenciesForm(this, tempProject,
-                unresolvedElements));
-            addPage(new ExportsForm(this, tempProject));
-            textPage = new PropertiesForm(this, tempProject);
-            addPage(textPage, getEditorInput());
-            setPartName(project.getSymbolicName());
-
-            refreshTabImages();
-        }
-        catch (PartInitException e)
-        {
-            SigilCore.error("Failed to build " + this, e);
-        }
-    }
-
-    protected void refreshTabImages()
-    {
-        if (unresolvedElements.isEmpty())
-        {
-            setPageImage(dependenciesPageIndex, null);
-        }
-        else
-        {
-            setPageImage(dependenciesPageIndex, errorImage);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.EditorPart#doSaveAs()
-     */
-    @Override
-    public void doSaveAs()
-    {
-        // save as not allowed
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
-     */
-    @Override
-    public boolean isSaveAsAllowed()
-    {
-        return false;
-    }
-
-    @Override
-    public void dispose()
-    {
-        ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-        super.dispose();
-    }
-
-    public void resourceChanged(IResourceChangeEvent event)
-    {
-        try
-        {
-            switch (event.getType())
-            {
-                case IResourceChangeEvent.POST_BUILD:
-                    handleBuild(event);
-                    break;
-                case IResourceChangeEvent.POST_CHANGE:
-                    handleChange(event);
-                    break;
-            }
-        }
-        catch (CoreException e)
-        {
-            ErrorDialog.openError(getSite().getShell(), "Error", null, e.getStatus());
-        }
-    }
-
-    private void handleBuild(IResourceChangeEvent event) throws CoreException
-    {
-        refreshView();
-    }
-
-    private void handleChange(IResourceChangeEvent event) throws CoreException
-    {
-        IResourceDelta delta = event.getDelta();
-        final IFile editorFile = ((IFileEditorInput) getEditorInput()).getFile();
-        delta.accept(new IResourceDeltaVisitor()
-        {
-            public boolean visit(IResourceDelta delta) throws CoreException
-            {
-                int kind = delta.getKind();
-                IResource resource = delta.getResource();
-                if (resource instanceof IProject)
-                {
-                    int flags = delta.getFlags();
-                    return handleProjectChange(editorFile, (IProject) resource, kind,
-                        flags);
-                }
-
-                if (resource instanceof IFile)
-                {
-                    handleFileChange(editorFile, (IFile) resource, kind);
-                    // Recurse no more
-                    return false;
-                }
-
-                return true;
-            }
-        });
-    }
-
-    protected void handleFileChange(IFile editorFile, IFile affectedFile, int kind)
-    {
-        if (affectedFile.equals(editorFile))
-        {
-            switch (kind)
-            {
-                case IResourceDelta.REMOVED:
-                    close(false);
-                    break;
-                case IResourceDelta.CHANGED:
-                    if (!saving)
-                    {
-                        reload();
-                    }
-                    SigilUI.runInUISync(new Runnable()
-                    {
-                        public void run()
-                        {
-                            setPartName(project.getSymbolicName());
-                        }
-                    });
-                    break;
-            }
-        }
-    }
-
-    private boolean handleProjectChange(IResource editorFile, IProject project, int kind,
-        int flags) throws CoreException
-    {
-        if (!editorFile.getProject().equals(project))
-        {
-            return false;
-        }
-        if (kind == IResourceDelta.CHANGED)
-        {
-            int mask = flags & (IResourceDelta.MARKERS);
-            if (mask > 0)
-            {
-                refreshView();
-            }
-        }
-        return true;
-    }
-
-    private void refreshView() throws CoreException
-    {
-        loadUnresolvedDependencies();
-        refreshAllPages();
-    }
-
-    void refreshAllPages()
-    {
-        Runnable op = new Runnable()
-        {
-            public void run()
-            {
-                for (Iterator<?> iter = pages.iterator(); iter.hasNext();)
-                {
-                    IFormPage page = (IFormPage) iter.next();
-                    if (page != null)
-                    {
-                        IManagedForm managedForm = page.getManagedForm();
-                        if (managedForm != null)
-                        {
-                            managedForm.refresh();
-                            IFormPart[] parts = managedForm.getParts();
-                            for (IFormPart part : parts)
-                            {
-                                part.refresh();
-                            }
-                        }
-                    }
-                }
-                firePropertyChange(IEditorPart.PROP_DIRTY);
-                setPartName(project.getSymbolicName());
-                refreshTabImages();
-            }
-        };
-        getSite().getShell().getDisplay().syncExec(op);
-    }
-
-    private void reload()
-    {
-        tempProject.setBundle(null);
-        project.setBundle(null);
-        refreshAllPages();
-    }
-
-    @Override
-    public void init(IEditorSite site, IEditorInput input) throws PartInitException
-    {
-        super.init(site, input);
-
-        try
-        {
-            this.project = SigilCore.create(getProject());
-            this.tempProject = (ISigilProjectModel) project.clone();
-        }
-        catch (CoreException e)
-        {
-            throw new PartInitException("Error creating Sigil project", e);
-        }
-
-        ResourcesPlugin.getWorkspace().addResourceChangeListener(this,
-            IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_REFRESH);
-
-        if (input instanceof IFileEditorInput)
-        {
-            try
-            {
-                loadUnresolvedDependencies();
-            }
-            catch (CoreException e)
-            {
-                throw new PartInitException("Error retrieving dependency markers", e);
-            }
-        }
-    }
-
-    private void loadUnresolvedDependencies() throws CoreException
-    {
-        ModelElementFactory factory = ModelElementFactory.getInstance();
-        IMarker[] markers = getProject().findMarkers(
-            SigilCore.MARKER_UNRESOLVED_DEPENDENCY, true, IResource.DEPTH_ONE);
-        unresolvedElements.clear();
-
-        for (IMarker marker : markers)
-        {
-            String elementName = (String) marker.getAttribute("element");
-            String versionRangeStr = (String) marker.getAttribute("versionRange");
-            if (elementName != null && versionRangeStr != null)
-            {
-                if (marker.getType().equals(SigilCore.MARKER_UNRESOLVED_IMPORT_PACKAGE))
-                {
-                    IPackageImport pkgImport = factory.newModelElement(IPackageImport.class);
-                    pkgImport.setPackageName(elementName);
-                    pkgImport.setVersions(VersionRange.parseVersionRange(versionRangeStr));
-                    unresolvedElements.add(pkgImport);
-                }
-                else if (marker.getType().equals(
-                    SigilCore.MARKER_UNRESOLVED_REQUIRE_BUNDLE))
-                {
-                    IRequiredBundle req = factory.newModelElement(IRequiredBundle.class);
-                    req.setSymbolicName(elementName);
-                    req.setVersions(VersionRange.parseVersionRange(versionRangeStr));
-                    unresolvedElements.add(req);
-                }
-            }
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/SigilSourcePage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/SigilSourcePage.java
deleted file mode 100644
index 1b38972..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/SigilSourcePage.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.sigil.eclipse.ui.internal.editors.project;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.ITextListener;
-import org.eclipse.jface.text.TextEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.ide.IDE;
-
-public class SigilSourcePage extends TextEditor implements IFormPage
-{
-    private final String id;
-    private int index;
-    private SigilProjectEditorPart editor;
-    private boolean active;
-    private Control control;
-
-    public SigilSourcePage(String id)
-    {
-        this.id = id;
-    }
-
-    @Override
-    public void createPartControl(Composite parent)
-    {
-        super.createPartControl(parent);
-        Control[] children = parent.getChildren();
-        control = children[children.length - 1];
-        getSourceViewer().addTextListener(new ITextListener()
-        {
-            public void textChanged(TextEvent event)
-            {
-                if (editor != null)
-                {
-                    editor.refreshAllPages();
-                }
-            }
-        });
-        //PlatformUI.getWorkbench().getHelpSystem().setHelp(fControl, IHelpContextIds.MANIFEST_SOURCE_PAGE);
-    }
-
-    public void initialize(FormEditor editor)
-    {
-        this.editor = (SigilProjectEditorPart) editor;
-    }
-
-    public FormEditor getEditor()
-    {
-        return editor;
-    }
-
-    public String getId()
-    {
-        return id;
-    }
-
-    public int getIndex()
-    {
-        return index;
-    }
-
-    public void setIndex(int index)
-    {
-        this.index = index;
-    }
-
-    public boolean isActive()
-    {
-        return active;
-    }
-
-    public void setActive(boolean active)
-    {
-        this.active = active;
-    }
-
-    public Control getPartControl()
-    {
-        return control;
-    }
-
-    public boolean selectReveal(Object object)
-    {
-        if (object instanceof IMarker)
-        {
-            IDE.gotoMarker(this, (IMarker) object);
-            return true;
-        }
-        return false;
-    }
-
-    // static impls
-    public boolean isEditor()
-    {
-        return true;
-    }
-
-    public boolean canLeaveThePage()
-    {
-        return true;
-    }
-
-    public IManagedForm getManagedForm()
-    {
-        // this is not a form
-        return null;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/TestingSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/TestingSection.java
deleted file mode 100644
index 24b2e1f..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/TestingSection.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.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilSection;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.ui.ILaunchShortcut;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-public class TestingSection extends SigilSection
-{
-
-    public TestingSection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(page, parent, project);
-    }
-
-    protected void createSection(Section section, FormToolkit toolkit)
-    {
-        setTitle("Testing");
-
-        Composite body = createTableWrapBody(1, toolkit);
-
-        toolkit.createLabel(body,
-            "Test this project by launching a separate Newton application:");
-
-        Hyperlink launch = toolkit.createHyperlink(body, "Launch a newton container",
-            SWT.NULL);
-        launch.setHref("launchShortcut.run.org.cauldron.sigil.launching.shortcut");
-        launch.addHyperlinkListener(this);
-
-        Hyperlink debug = toolkit.createHyperlink(body, "Debug a newton container",
-            SWT.NULL);
-        debug.setHref("launchShortcut.debug.org.cauldron.sigil.launching.shortcut");
-        debug.addHyperlinkListener(this);
-    }
-
-    public void linkActivated(HyperlinkEvent e)
-    {
-        String href = (String) e.getHref();
-        if (href.startsWith("launchShortcut.")) { //$NON-NLS-1$
-            href = href.substring(15);
-            int index = href.indexOf('.');
-            if (index < 0)
-                return; // error.  Format of href should be launchShortcut.<mode>.<launchShortcutId>
-            String mode = href.substring(0, index);
-            String id = href.substring(index + 1);
-
-            //getEditor().doSave(null);
-
-            IExtensionRegistry registry = Platform.getExtensionRegistry();
-            IConfigurationElement[] elements = registry.getConfigurationElementsFor("org.eclipse.debug.ui.launchShortcuts"); //$NON-NLS-1$
-            for (int i = 0; i < elements.length; i++)
-            {
-                if (id.equals(elements[i].getAttribute("id"))) //$NON-NLS-1$
-                    try
-                    {
-                        ILaunchShortcut shortcut = (ILaunchShortcut) elements[i].createExecutableExtension("class"); //$NON-NLS-1$
-                        // preLaunch();
-                        shortcut.launch(new StructuredSelection(getLaunchObject()), mode);
-                    }
-                    catch (CoreException e1)
-                    {
-                        e1.printStackTrace();
-                    }
-            }
-        }
-    }
-
-    private Object getLaunchObject()
-    {
-        return getProjectModel().getProject();
-    }
-
-    public void linkEntered(HyperlinkEvent e)
-    {
-    }
-
-    public void linkExited(HyperlinkEvent e)
-    {
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ToolsSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ToolsSection.java
deleted file mode 100644
index f8a5b57..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/ToolsSection.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.actions.PruneProjectDependenciesAction;
-import org.apache.felix.sigil.eclipse.ui.actions.ResolveProjectDependenciesAction;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilPage;
-import org.apache.felix.sigil.eclipse.ui.internal.form.SigilSection;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-public class ToolsSection extends SigilSection
-{
-
-    public ToolsSection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(page, parent, project);
-    }
-
-    protected void createSection(Section section, FormToolkit toolkit)
-    {
-        setTitle("Tools");
-
-        Composite body = createTableWrapBody(1, toolkit);
-
-        toolkit.createLabel(body, "Tools to help manage this project:");
-
-        Hyperlink launch = toolkit.createHyperlink(body, "Resolve missing dependencies",
-            SWT.NULL);
-        launch.setHref("resolve");
-        launch.addHyperlinkListener(this);
-
-        Hyperlink debug = toolkit.createHyperlink(body, "Prune unused dependencies",
-            SWT.NULL);
-        debug.setHref("prune");
-        debug.addHyperlinkListener(this);
-    }
-
-    public void linkActivated(HyperlinkEvent e)
-    {
-        String href = (String) e.getHref();
-        if ("resolve".equals(href))
-        {
-            handleResolve();
-        }
-        else if ("prune".equals(href))
-        {
-            handlePrune();
-        }
-    }
-
-    private void handlePrune()
-    {
-        new PruneProjectDependenciesAction(getProjectModel()).run();
-    }
-
-    private void handleResolve()
-    {
-        final ISigilProjectModel project = getProjectModel();
-        new ResolveProjectDependenciesAction(project, true).run();
-    }
-
-    public void linkEntered(HyperlinkEvent e)
-    {
-    }
-
-    public void linkExited(HyperlinkEvent e)
-    {
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/VersionRangeComponent.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/VersionRangeComponent.java
deleted file mode 100644
index db97af2..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/VersionRangeComponent.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.apache.felix.sigil.eclipse.ui.util.IValidationListener;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.osgi.framework.Version;
-
-public class VersionRangeComponent extends Composite
-{
-    private VersionRange versions = VersionRange.ANY_VERSION;
-
-    private Button specificButton;
-
-    private Text specificText;
-    private Button rangeButton;
-    private Text minimumText;
-    private Text maximumText;
-    private Button minInclusiveButton;
-    private Button maxInclusiveButton;
-
-    private Set<VersionsChangeListener> listeners = new HashSet<VersionsChangeListener>();
-    private Set<IValidationListener> validationListeners = new HashSet<IValidationListener>();
-
-    public VersionRangeComponent(Composite parent, int style)
-    {
-        super(parent, style);
-        createComponents(this);
-    }
-
-    public void addVersionChangeListener(VersionsChangeListener listener)
-    {
-        synchronized (listeners)
-        {
-            listeners.add(listener);
-        }
-    }
-
-    public void removeVersionChangeListener(VersionsChangeListener listener)
-    {
-        synchronized (listeners)
-        {
-            listeners.remove(listener);
-        }
-    }
-
-    public void addValidationListener(IValidationListener listener)
-    {
-        validationListeners.add(listener);
-    }
-
-    public void removeValidationListener(IValidationListener listener)
-    {
-        validationListeners.remove(listener);
-    }
-
-    @Override
-    public void setEnabled(boolean enabled)
-    {
-        super.setEnabled(enabled);
-        specificButton.setEnabled(enabled);
-        rangeButton.setEnabled(enabled);
-        if (enabled)
-        {
-            specificButton.setSelection(versions.isPointVersion());
-            setSpecific();
-        }
-        else
-        {
-            minimumText.setEnabled(enabled);
-            maximumText.setEnabled(enabled);
-            minInclusiveButton.setEnabled(enabled);
-            maxInclusiveButton.setEnabled(enabled);
-        }
-    }
-
-    public VersionRange getVersions()
-    {
-        return versions;
-    }
-
-    public void setVersions(VersionRange versions)
-    {
-        this.versions = versions == null ? VersionRange.ANY_VERSION : versions;
-        updateFields();
-    }
-
-    private void updateFields()
-    {
-        if (versions.isPointVersion())
-        {
-            specificButton.setSelection(true);
-            specificText.setText(versions.getCeiling() == VersionRange.INFINITE_VERSION ? "*"
-                : versions.getFloor().toString());
-        }
-        else
-        {
-            rangeButton.setSelection(true);
-            minimumText.setText(versions.getFloor().toString());
-            minInclusiveButton.setSelection(!versions.isOpenFloor());
-            maximumText.setText(versions.getCeiling() == VersionRange.INFINITE_VERSION ? "*"
-                : versions.getCeiling().toString());
-            maxInclusiveButton.setSelection(!versions.isOpenCeiling());
-        }
-
-        setSpecific();
-    }
-
-    private void createComponents(Composite body)
-    {
-        setLayout(new GridLayout(3, false));
-
-        specificButton = new Button(body, SWT.RADIO);
-        specificButton.setText("Specific:");
-        specificButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                setSpecific();
-            }
-        });
-
-        new Label(body, SWT.NONE).setText("Version:");
-
-        specificText = new Text(body, SWT.BORDER);
-        specificText.addKeyListener(new KeyAdapter()
-        {
-            @Override
-            public void keyReleased(KeyEvent e)
-            {
-                setVersions();
-            }
-        });
-
-        rangeButton = new Button(body, SWT.RADIO);
-        rangeButton.setText("Range:");
-
-        new Label(body, SWT.NONE).setText("Minimum:");
-
-        minimumText = new Text(body, SWT.BORDER);
-        minimumText.addKeyListener(new KeyAdapter()
-        {
-            @Override
-            public void keyReleased(KeyEvent e)
-            {
-                setVersions();
-            }
-        });
-
-        minInclusiveButton = new Button(body, SWT.CHECK);
-        minInclusiveButton.setText("inclusive");
-        minInclusiveButton.setSelection(true);
-        minInclusiveButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                setVersions();
-            }
-        });
-
-        new Label(body, SWT.NONE).setText("Maximum:");
-        maximumText = new Text(body, SWT.BORDER);
-        maximumText.addKeyListener(new KeyAdapter()
-        {
-            @Override
-            public void keyReleased(KeyEvent e)
-            {
-                setVersions();
-            }
-        });
-
-        maxInclusiveButton = new Button(body, SWT.CHECK);
-        maxInclusiveButton.setText("inclusive");
-        maxInclusiveButton.setSelection(false);
-        maxInclusiveButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                setVersions();
-            }
-        });
-
-        // Layout
-        specificButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1));
-        specificText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
-        rangeButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1));
-        minimumText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        maximumText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
-        updateFields();
-    }
-
-    private void setVersions()
-    {
-        try
-        {
-            if (specificButton.getSelection())
-            {
-                if ("*".equals(specificText.getText()))
-                {
-                    versions = VersionRange.ANY_VERSION;
-                }
-                else if (specificText.getText().trim().length() == 0)
-                {
-                    versions = null;
-                }
-                else
-                {
-                    Version v = VersionTable.getVersion(specificText.getText().trim());
-                    versions = new VersionRange(false, v, v, false);
-                }
-            }
-            else
-            {
-                Version min = VersionTable.getVersion(minimumText.getText());
-                Version max = "*".equals(maximumText.getText()) ? VersionRange.INFINITE_VERSION
-                    : VersionTable.getVersion(maximumText.getText());
-                versions = new VersionRange(!minInclusiveButton.getSelection(), min, max,
-                    !maxInclusiveButton.getSelection());
-            }
-            fireValidationMessage(null, IMessageProvider.NONE);
-        }
-        catch (IllegalArgumentException e)
-        {
-            versions = null;
-            fireValidationMessage("Invalid version", IMessageProvider.ERROR);
-        }
-
-        fireVersionChange();
-    }
-
-    private void fireVersionChange()
-    {
-        synchronized (listeners)
-        {
-            for (VersionsChangeListener l : listeners)
-            {
-                l.versionsChanged(versions);
-            }
-        }
-    }
-
-    private void fireValidationMessage(String message, int level)
-    {
-        for (IValidationListener validationListener : validationListeners)
-        {
-            validationListener.validationMessage(message, level);
-        }
-    }
-
-    private void setSpecific()
-    {
-        boolean specific = specificButton.getSelection();
-        specificButton.setSelection(specific);
-        specificText.setEnabled(specific);
-        minimumText.setEnabled(!specific);
-        maximumText.setEnabled(!specific);
-        minInclusiveButton.setEnabled(!specific);
-        maxInclusiveButton.setEnabled(!specific);
-        setVersions();
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/VersionsChangeListener.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/VersionsChangeListener.java
deleted file mode 100644
index c8c2c09..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/editors/project/VersionsChangeListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.editors.project;
-
-import org.apache.felix.sigil.common.osgi.VersionRange;
-
-public interface VersionsChangeListener
-{
-    void versionsChanged(VersionRange range);
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/IFormValueConverter.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/IFormValueConverter.java
deleted file mode 100644
index 8897857..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/IFormValueConverter.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.form;
-
-public interface IFormValueConverter
-{
-    String getLabel(Object value);
-
-    Object getValue(String label);
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/ISigilFormEntryListener.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/ISigilFormEntryListener.java
deleted file mode 100644
index 9c09f27..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/ISigilFormEntryListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.form;
-
-public interface ISigilFormEntryListener
-{
-    void browseButtonSelected(SigilFormEntry form);
-
-    void textValueChanged(SigilFormEntry form);
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilFormEntry.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilFormEntry.java
deleted file mode 100644
index db480fa..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilFormEntry.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.form;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.IFormColors;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-public class SigilFormEntry
-{
-    private static final IFormValueConverter NULL_DESCRIPTOR = new IFormValueConverter()
-    {
-        public String getLabel(Object value)
-        {
-            return (String) value;
-        }
-
-        public Object getValue(String label)
-        {
-            return label;
-        }
-    };
-
-    private Label lbl;
-    private Text txt;
-    private Button btn;
-    private IFormValueConverter descriptor;
-    private boolean freeText = true;
-
-    private Object value;
-    private ISigilFormEntryListener listener;
-
-    public SigilFormEntry(Composite parent, FormToolkit toolkit, String title)
-    {
-        this(parent, toolkit, title, null, null);
-    }
-
-    public SigilFormEntry(Composite parent, FormToolkit toolkit, String title, String browse, IFormValueConverter descriptor)
-    {
-        this.descriptor = descriptor == null ? NULL_DESCRIPTOR : descriptor;
-        createComponent(parent, title, browse, toolkit);
-    }
-
-    public void setFormEntryListener(ISigilFormEntryListener listener)
-    {
-        this.listener = listener;
-    }
-
-    public void setValue(Object value)
-    {
-        this.value = value;
-        String text = descriptor.getLabel(value);
-        if (text == null)
-        {
-            text = "";
-        }
-        txt.setText(text);
-        handleValueChanged();
-    }
-
-    public Object getValue()
-    {
-        return value;
-    }
-
-    public void setFreeText(boolean freeText)
-    {
-        this.freeText = freeText;
-    }
-
-    public void setEditable(boolean editable)
-    {
-        lbl.setEnabled(editable);
-        txt.setEditable(editable);
-        if (btn != null)
-        {
-            btn.setEnabled(editable);
-        }
-    }
-
-    private void createComponent(Composite parent, String title, String browse,
-        FormToolkit toolkit)
-    {
-        lbl = toolkit.createLabel(parent, title);
-        lbl.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
-
-        txt = toolkit.createText(parent, "", SWT.SINGLE | SWT.BORDER);
-        txt.addKeyListener(new KeyAdapter()
-        {
-            @Override
-            public void keyPressed(KeyEvent e)
-            {
-                if (freeText)
-                {
-                    switch (e.character)
-                    {
-                        case '\r':
-                            handleValueChanged();
-                    }
-                }
-                else
-                {
-                    switch (e.character)
-                    {
-                        case '\b':
-                            setValue(null);
-                            handleValueChanged();
-                        default:
-                            e.doit = false;
-                            break;
-                    }
-                }
-            }
-        });
-        txt.addFocusListener(new FocusAdapter()
-        {
-            @Override
-            public void focusLost(FocusEvent e)
-            {
-                handleValueChanged();
-            }
-        });
-
-        if (browse != null)
-        {
-            btn = toolkit.createButton(parent, browse, SWT.PUSH);
-            btn.addSelectionListener(new SelectionAdapter()
-            {
-                @Override
-                public void widgetSelected(SelectionEvent e)
-                {
-                    handleBrowseSelected();
-                }
-            });
-        }
-
-        fillIntoGrid(parent);
-    }
-
-    private void handleBrowseSelected()
-    {
-        if (listener != null)
-        {
-            listener.browseButtonSelected(this);
-        }
-    }
-
-    private void handleValueChanged()
-    {
-        if (freeText)
-        {
-            this.value = descriptor.getValue(txt.getText());
-        }
-        if (listener != null)
-        {
-            listener.textValueChanged(this);
-        }
-    }
-
-    private void fillIntoGrid(Composite parent)
-    {
-        if (parent.getLayout() instanceof GridLayout)
-        {
-            GridLayout layout = (GridLayout) parent.getLayout();
-
-            int cols = layout.numColumns;
-
-            lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
-
-            if (btn == null)
-            {
-                txt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
-                    Math.max(1, cols - 1), 1));
-            }
-            else
-            {
-                txt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
-                    Math.max(1, cols - 2), 1));
-            }
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilFormEntryAdapter.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilFormEntryAdapter.java
deleted file mode 100644
index df25a5e..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilFormEntryAdapter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.form;
-
-public class SigilFormEntryAdapter implements ISigilFormEntryListener
-{
-    public void browseButtonSelected(SigilFormEntry form)
-    {
-    }
-
-    public void textValueChanged(SigilFormEntry form)
-    {
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilPage.java
deleted file mode 100644
index 12be8b8..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilPage.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.form;
-
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-
-public class SigilPage extends FormPage
-{
-
-    public SigilPage(FormEditor editor, String id, String title)
-    {
-        super(editor, id, title);
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilSection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilSection.java
deleted file mode 100644
index 704d431..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/form/SigilSection.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.form;
-
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.forms.IFormPart;
-import org.eclipse.ui.forms.IPartSelectionListener;
-import org.eclipse.ui.forms.SectionPart;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-public abstract class SigilSection extends SectionPart implements IHyperlinkListener, IPartSelectionListener
-{
-
-    private SigilPage page;
-    private ISigilProjectModel project;
-
-    public SigilSection(SigilPage page, Composite parent, ISigilProjectModel project) throws CoreException
-    {
-        super(parent, page.getManagedForm().getToolkit(), ExpandableComposite.TITLE_BAR
-            | ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
-        this.project = project;
-        this.page = page;
-        createSection(getSection(), page.getManagedForm().getToolkit());
-    }
-
-    public ISigilProjectModel getProjectModel()
-    {
-        return project;
-    }
-
-    public SigilPage getPage()
-    {
-        return page;
-    }
-
-    public void setExpanded(boolean expanded)
-    {
-        getSection().setExpanded(expanded);
-    }
-
-    protected abstract void createSection(Section section, FormToolkit toolkit)
-        throws CoreException;
-
-    protected void setTitle(String title)
-    {
-        Section section = getSection();
-        section.setText(title);
-
-        TableWrapLayout layout = new TableWrapLayout();
-
-        layout.topMargin = 2;
-        layout.bottomMargin = 2;
-        layout.leftMargin = 2;
-        layout.rightMargin = 2;
-
-        layout.horizontalSpacing = 0;
-        layout.verticalSpacing = 0;
-
-        layout.makeColumnsEqualWidth = false;
-        layout.numColumns = 1;
-
-        section.setLayout(layout);
-
-        TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
-        section.setLayoutData(data);
-    }
-
-    protected void setMarker(String type, String message, int priority, int severity)
-        throws CoreException
-    {
-        IFileEditorInput file = (IFileEditorInput) getPage().getEditor().getEditorInput();
-        IMarker marker = file.getFile().createMarker(type);
-        marker.setAttribute(IMarker.MESSAGE, message);
-        marker.setAttribute(IMarker.PRIORITY, priority);
-        marker.setAttribute(IMarker.SEVERITY, severity);
-    }
-
-    protected void clearMarkers() throws CoreException
-    {
-        IFileEditorInput file = (IFileEditorInput) getPage().getEditor().getEditorInput();
-        file.getFile().deleteMarkers(null, true, IResource.DEPTH_INFINITE);
-    }
-
-    protected Composite createTableWrapBody(int columns, FormToolkit toolkit)
-    {
-        Section section = getSection();
-        Composite client = toolkit.createComposite(section);
-
-        TableWrapLayout layout = new TableWrapLayout();
-        layout.leftMargin = layout.rightMargin = toolkit.getBorderStyle() != SWT.NULL ? 0
-            : 2;
-        layout.numColumns = columns;
-        client.setLayout(layout);
-        client.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-
-        section.setClient(client);
-
-        return client;
-    }
-
-    protected Composite createGridBody(int columns, boolean columnsSameWidth,
-        FormToolkit toolkit)
-    {
-        Section section = getSection();
-        Composite client = toolkit.createComposite(section);
-
-        GridLayout layout = new GridLayout();
-
-        layout.makeColumnsEqualWidth = columnsSameWidth;
-        layout.numColumns = columns;
-        client.setLayout(layout);
-
-        client.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-
-        section.setClient(client);
-
-        return client;
-    }
-
-    public void linkActivated(HyperlinkEvent e)
-    {
-    }
-
-    public void linkExited(HyperlinkEvent e)
-    {
-    }
-
-    public void linkEntered(HyperlinkEvent e)
-    {
-    }
-
-    public void selectionChanged(IFormPart part, ISelection selection)
-    {
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/AbstractResourceCommandHandler.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/AbstractResourceCommandHandler.java
deleted file mode 100644
index 6f77d31..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/AbstractResourceCommandHandler.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.handlers;
-
-import org.eclipse.core.commands.AbstractHandler;
-
-public abstract class AbstractResourceCommandHandler extends AbstractHandler
-{
-
-    protected abstract IResourceCommandHandler getResourceCommandHandler();
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/EditorResourceCommandHandler.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/EditorResourceCommandHandler.java
deleted file mode 100644
index addde2b..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/EditorResourceCommandHandler.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.handlers;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-public abstract class EditorResourceCommandHandler extends AbstractResourceCommandHandler
-{
-
-    public Object execute(ExecutionEvent event) throws ExecutionException
-    {
-        final Shell shell = HandlerUtil.getActiveShell(event);
-        final IEditorPart editorPart = HandlerUtil.getActiveEditor(event);
-        if (editorPart != null)
-        {
-            IEditorInput editorInput = editorPart.getEditorInput();
-
-            if (!(editorInput instanceof IFileEditorInput))
-            {
-                throw new ExecutionException("Editor input must be a file");
-            }
-            IFileEditorInput fileInput = (IFileEditorInput) editorInput;
-
-            try
-            {
-                // Save the editor content (if dirty)
-                IRunnableWithProgress saveOperation = new IRunnableWithProgress()
-                {
-                    public void run(IProgressMonitor monitor)
-                        throws InvocationTargetException, InterruptedException
-                    {
-                        if (editorPart.isDirty())
-                        {
-                            if (MessageDialog.openQuestion(
-                                shell,
-                                "Save File",
-                                "The file contents must be saved before the command can be executed. Do you wish to save now?"))
-                            {
-                                editorPart.doSave(monitor);
-                            }
-                            else
-                            {
-                                throw new InterruptedException();
-                            }
-                        }
-                    }
-                };
-                new ProgressMonitorDialog(shell).run(false, true, saveOperation);
-
-                // Execute on the file
-                IFile file = fileInput.getFile();
-                getResourceCommandHandler().execute(new IResource[] { file }, event);
-            }
-            catch (InvocationTargetException e)
-            {
-                throw new ExecutionException("Error saving file", e.getTargetException());
-            }
-            catch (InterruptedException e)
-            {
-                // Exit the command silently
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/IResourceCommandHandler.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/IResourceCommandHandler.java
deleted file mode 100644
index 68350db..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/IResourceCommandHandler.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.handlers;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IResource;
-
-public interface IResourceCommandHandler
-{
-
-    Object execute(IResource[] resources, ExecutionEvent event) throws ExecutionException;
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/SelectionResourceCommandHandler.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/SelectionResourceCommandHandler.java
deleted file mode 100644
index 3085ee1..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/SelectionResourceCommandHandler.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.handlers;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-public abstract class SelectionResourceCommandHandler extends AbstractResourceCommandHandler
-{
-
-    public final Object execute(ExecutionEvent event) throws ExecutionException
-    {
-        ISelection selection = HandlerUtil.getCurrentSelection(event);
-
-        Object[] objectArray = ((IStructuredSelection) selection).toArray();
-        IResource[] resourceArray = new IResource[objectArray.length];
-        System.arraycopy(objectArray, 0, resourceArray, 0, objectArray.length);
-
-        return getResourceCommandHandler().execute(resourceArray, event);
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/ConvertProjectCommandHandler.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/ConvertProjectCommandHandler.java
deleted file mode 100644
index bee06fe..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/ConvertProjectCommandHandler.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.handlers.project;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.internal.handlers.IResourceCommandHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-public class ConvertProjectCommandHandler implements IResourceCommandHandler
-{
-
-    public Object execute(IResource[] resources, ExecutionEvent event)
-        throws ExecutionException
-    {
-        for (IResource r : resources)
-        {
-            final IProject project = (IProject) r;
-            if (project != null)
-            {
-                WorkspaceModifyOperation op = new WorkspaceModifyOperation()
-                {
-                    @Override
-                    protected void execute(IProgressMonitor monitor) throws CoreException
-                    {
-                        SigilCore.makeSigilProject(project, monitor);
-                        IJavaProject java = JavaCore.create(project);
-                        ISigilProjectModel sigil = SigilCore.create(project);
-                        String bsn = project.getName();
-                        sigil.getBundle().getBundleInfo().setSymbolicName(bsn);
-
-                        IClasspathEntry[] entries = java.getRawClasspath();
-                        for (int i = 0; i < entries.length; i++)
-                        {
-                            IClasspathEntry entry = entries[i];
-                            if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE)
-                            {
-                                String encodedClasspath = sigil.getJavaModel().encodeClasspathEntry(
-                                    entry);
-                                sigil.getBundle().addClasspathEntry(encodedClasspath);
-                            }
-                        }
-                        sigil.save(monitor);
-                    }
-                };
-                SigilUI.runWorkspaceOperation(op, null);
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/ConvertProjectHandler.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/ConvertProjectHandler.java
deleted file mode 100644
index 919cc65..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/ConvertProjectHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.handlers.project;
-
-import org.apache.felix.sigil.eclipse.ui.internal.handlers.IResourceCommandHandler;
-import org.apache.felix.sigil.eclipse.ui.internal.handlers.SelectionResourceCommandHandler;
-
-public class ConvertProjectHandler extends SelectionResourceCommandHandler
-{
-
-    @Override
-    protected IResourceCommandHandler getResourceCommandHandler()
-    {
-        return new ConvertProjectCommandHandler();
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/RefreshSigilClasspathCommandHandler.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/RefreshSigilClasspathCommandHandler.java
deleted file mode 100644
index f23ce33..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/RefreshSigilClasspathCommandHandler.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.handlers.project;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.internal.handlers.IResourceCommandHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-public class RefreshSigilClasspathCommandHandler implements IResourceCommandHandler
-{
-
-    public Object execute(IResource[] resources, ExecutionEvent event)
-        throws ExecutionException
-    {
-        try
-        {
-            for (IResource res : resources)
-            {
-                IProject p = (IProject) res;
-                final ISigilProjectModel model = SigilCore.create(p);
-
-                WorkspaceModifyOperation op = new WorkspaceModifyOperation()
-                {
-                    @Override
-                    protected void execute(IProgressMonitor monitor)
-                        throws CoreException, InvocationTargetException,
-                        InterruptedException
-                    {
-                        model.resetClasspath(monitor, true);
-                    }
-                };
-
-                SigilUI.runWorkspaceOperation(op, null);
-            }
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to create sigil project for refresh action", e);
-        }
-        return null;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/RefreshSigilClasspathHandler.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/RefreshSigilClasspathHandler.java
deleted file mode 100644
index 8c6317d..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/RefreshSigilClasspathHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.handlers.project;
-
-import org.apache.felix.sigil.eclipse.ui.internal.handlers.IResourceCommandHandler;
-import org.apache.felix.sigil.eclipse.ui.internal.handlers.SelectionResourceCommandHandler;
-
-public class RefreshSigilClasspathHandler extends SelectionResourceCommandHandler
-{
-
-    @Override
-    protected IResourceCommandHandler getResourceCommandHandler()
-    {
-        return new RefreshSigilClasspathCommandHandler();
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/perspective/SigilPerspectiveFactory.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/perspective/SigilPerspectiveFactory.java
deleted file mode 100644
index de0bffe..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/perspective/SigilPerspectiveFactory.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.perspective;
-
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.progress.IProgressConstants;
-
-public class SigilPerspectiveFactory implements IPerspectiveFactory
-{
-
-    private static final String ID_PROJECT_EXPLORER = "org.eclipse.ui.navigator.ProjectExplorer"; //$NON-NLS-1$
-    private static final String ID_SEARCH_VIEW = "org.eclipse.search.ui.views.SearchView"; //$NON-NLS-1$
-    private static final String ID_CONSOLE_VIEW = "org.eclipse.ui.console.ConsoleView"; //$NON-NLS-1$
-
-    public void createInitialLayout(IPageLayout layout)
-    {
-        /*
-         * Use ProjectExplorer vs PackageExplorer due to a bug with Drag and Drop on Mac OS X which affects PackageExplorer
-         * but not ProjectExplorer. https://bugs.eclipse.org/bugs/show_bug.cgi?id=243529
-         */
-        String editorArea = layout.getEditorArea();
-
-        IFolderLayout folder = layout.createFolder(
-            "left", IPageLayout.LEFT, (float) 0.25, editorArea); //$NON-NLS-1$
-        folder.addView(ID_PROJECT_EXPLORER);
-        folder.addView(JavaUI.ID_TYPE_HIERARCHY);
-        folder.addPlaceholder(IPageLayout.ID_RES_NAV);
-        folder.addPlaceholder(SigilUI.ID_REPOSITORY_VIEW);
-        folder.addView(IPageLayout.ID_OUTLINE);
-
-        IFolderLayout outputfolder = layout.createFolder(
-            "bottom", IPageLayout.BOTTOM, (float) 0.75, editorArea); //$NON-NLS-1$
-        outputfolder.addView(IPageLayout.ID_PROBLEM_VIEW);
-        outputfolder.addView(JavaUI.ID_JAVADOC_VIEW);
-        outputfolder.addView(JavaUI.ID_SOURCE_VIEW);
-        outputfolder.addPlaceholder(ID_SEARCH_VIEW);
-        outputfolder.addPlaceholder(ID_CONSOLE_VIEW);
-        outputfolder.addPlaceholder(IPageLayout.ID_BOOKMARKS);
-        outputfolder.addPlaceholder(IProgressConstants.PROGRESS_VIEW_ID);
-        outputfolder.addPlaceholder(SigilUI.ID_DEPENDENCY_VIEW);
-
-        layout.addActionSet(IDebugUIConstants.LAUNCH_ACTION_SET);
-        layout.addActionSet(JavaUI.ID_ACTION_SET);
-        layout.addActionSet(JavaUI.ID_ELEMENT_CREATION_ACTION_SET);
-        layout.addActionSet(IPageLayout.ID_NAVIGATE_ACTION_SET);
-
-        // views - sigil
-        layout.addShowViewShortcut(SigilUI.ID_REPOSITORY_VIEW);
-        layout.addShowViewShortcut(SigilUI.ID_DEPENDENCY_VIEW);
-
-        // views - java
-        layout.addShowViewShortcut(JavaUI.ID_PACKAGES);
-        layout.addShowViewShortcut(JavaUI.ID_TYPE_HIERARCHY);
-        layout.addShowViewShortcut(JavaUI.ID_SOURCE_VIEW);
-        layout.addShowViewShortcut(JavaUI.ID_JAVADOC_VIEW);
-
-        // views - search
-        layout.addShowViewShortcut(ID_SEARCH_VIEW);
-
-        // views - debugging
-        layout.addShowViewShortcut(ID_CONSOLE_VIEW);
-
-        // views - standard workbench
-        layout.addShowViewShortcut(IPageLayout.ID_OUTLINE);
-        layout.addShowViewShortcut(IPageLayout.ID_PROBLEM_VIEW);
-        layout.addShowViewShortcut(IPageLayout.ID_RES_NAV);
-        layout.addShowViewShortcut(IPageLayout.ID_TASK_LIST);
-        layout.addShowViewShortcut(IProgressConstants.PROGRESS_VIEW_ID);
-        layout.addShowViewShortcut(ID_PROJECT_EXPLORER);
-
-        // new actions - Java project creation wizard
-        layout.addNewWizardShortcut("org.eclipse.jdt.ui.wizards.NewPackageCreationWizard"); //$NON-NLS-1$
-        layout.addNewWizardShortcut("org.eclipse.jdt.ui.wizards.NewClassCreationWizard"); //$NON-NLS-1$
-        layout.addNewWizardShortcut("org.eclipse.jdt.ui.wizards.NewInterfaceCreationWizard"); //$NON-NLS-1$
-        layout.addNewWizardShortcut("org.eclipse.jdt.ui.wizards.NewEnumCreationWizard"); //$NON-NLS-1$
-        layout.addNewWizardShortcut("org.eclipse.jdt.ui.wizards.NewAnnotationCreationWizard"); //$NON-NLS-1$
-        layout.addNewWizardShortcut("org.eclipse.jdt.ui.wizards.NewSourceFolderCreationWizard"); //$NON-NLS-1$
-        layout.addNewWizardShortcut("org.eclipse.jdt.ui.wizards.NewSnippetFileCreationWizard"); //$NON-NLS-1$
-        layout.addNewWizardShortcut("org.eclipse.jdt.ui.wizards.NewJavaWorkingSetWizard"); //$NON-NLS-1$
-        layout.addNewWizardShortcut("org.eclipse.ui.wizards.new.folder");//$NON-NLS-1$
-        layout.addNewWizardShortcut("org.eclipse.ui.wizards.new.file");//$NON-NLS-1$
-        layout.addNewWizardShortcut("org.eclipse.ui.editors.wizards.UntitledTextFileWizard");//$NON-NLS-1$
-
-        layout.addNewWizardShortcut("org.apache.felix.sigil.editors.newProjectWizard");
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/ExcludedResourcesPrefsPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/ExcludedResourcesPrefsPage.java
deleted file mode 100644
index 304fccd..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/ExcludedResourcesPrefsPage.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences;
-
-import java.util.ArrayList;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.preferences.PrefsUtils;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class ExcludedResourcesPrefsPage extends PreferencePage implements IWorkbenchPreferencePage
-{
-
-    private TableViewer viewer;
-    private ArrayList<String> resources;
-
-    public ExcludedResourcesPrefsPage()
-    {
-        super();
-        setDescription("Specify resources that should not be offered for inclusion in a generated bundle.");
-    }
-
-    @Override
-    protected Control createContents(Composite parent)
-    {
-        // Create controls
-        Composite composite = new Composite(parent, SWT.NONE);
-        Table table = new Table(composite, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
-
-        Button btnAdd = new Button(composite, SWT.PUSH);
-        btnAdd.setText("Add");
-
-        final Button btnRemove = new Button(composite, SWT.PUSH);
-        btnRemove.setText("Remove");
-        btnRemove.setEnabled(false);
-
-        // Create viewer
-        viewer = new TableViewer(table);
-        viewer.setContentProvider(new ArrayContentProvider());
-
-        // Load data
-        loadPreferences(false);
-        viewer.setInput(resources);
-
-        // Listeners
-        viewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                btnRemove.setEnabled(!viewer.getSelection().isEmpty());
-            }
-        });
-
-        btnRemove.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-                Object[] deleted = selection.toArray();
-                for (Object delete : deleted)
-                {
-                    resources.remove(delete);
-                }
-                viewer.remove(deleted);
-            }
-        });
-
-        btnAdd.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                InputDialog dialog = new InputDialog(getShell(), "Add Resource",
-                    "Enter resource name", "", new IInputValidator()
-                    {
-                        public String isValid(String newText)
-                        {
-                            String error = null;
-                            if (newText == null || newText.length() == 0)
-                            {
-                                error = "Name must not be empty.";
-                            }
-                            else if (resources.contains(newText))
-                            {
-                                error = "Specified resource name is already on the list.";
-                            }
-                            return error;
-                        }
-                    });
-
-                if (dialog.open() == Window.OK)
-                {
-                    String value = dialog.getValue();
-                    resources.add(value);
-                    viewer.add(value);
-                }
-            }
-        });
-
-        // Layout
-        composite.setLayout(new GridLayout(2, false));
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3));
-        btnAdd.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-        btnRemove.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-
-        return composite;
-    }
-
-    private void loadPreferences(boolean useDefaults)
-    {
-        String resourcesListStr = useDefaults ? getPreferenceStore().getDefaultString(
-            SigilCore.DEFAULT_EXCLUDED_RESOURCES) : getPreferenceStore().getString(
-            SigilCore.DEFAULT_EXCLUDED_RESOURCES);
-        String[] resourcesArray = PrefsUtils.stringToArray(resourcesListStr);
-
-        resources = new ArrayList<String>(resourcesArray.length);
-        for (String resource : resourcesArray)
-        {
-            resources.add(resource);
-        }
-    }
-
-    public void init(IWorkbench workbench)
-    {
-    }
-
-    @Override
-    protected IPreferenceStore doGetPreferenceStore()
-    {
-        return SigilCore.getDefault().getPreferenceStore();
-    }
-
-    @Override
-    public boolean performOk()
-    {
-        String resourcesStr = PrefsUtils.arrayToString(resources.toArray(new String[resources.size()]));
-        getPreferenceStore().setValue(SigilCore.DEFAULT_EXCLUDED_RESOURCES, resourcesStr);
-        return true;
-    }
-
-    @Override
-    protected void performDefaults()
-    {
-        super.performDefaults();
-        loadPreferences(true);
-        viewer.setInput(resources);
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/LibraryConfigurationDialog.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/LibraryConfigurationDialog.java
deleted file mode 100644
index e39605e..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/LibraryConfigurationDialog.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences;
-
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.TreeSet;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ILibrary;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.osgi.framework.Version;
-
-public class LibraryConfigurationDialog extends TitleAreaDialog
-{
-
-    private static final Comparator<IPackageImport> COMPARATOR = new Comparator<IPackageImport>()
-    {
-        public int compare(IPackageImport o1, IPackageImport o2)
-        {
-            return o1.getPackageName().compareTo(o2.getPackageName());
-        }
-    };
-
-    private String name;
-    private Version version;
-    private TreeSet<IPackageImport> packageImports = new TreeSet<IPackageImport>(
-        COMPARATOR);
-
-    private boolean editOnly;
-
-    private TableViewer viewer;
-    private Text txtName;
-    private Text txtVersion;
-
-    public LibraryConfigurationDialog(Shell parentShell)
-    {
-        super(parentShell);
-        name = "";
-        version = Version.emptyVersion;
-    }
-
-    public LibraryConfigurationDialog(Shell parentShell, ILibrary lib)
-    {
-        super(parentShell);
-        editOnly = true;
-        name = lib.getName();
-        version = lib.getVersion();
-        packageImports.addAll(lib.getImports());
-    }
-
-    @Override
-    protected Control createDialogArea(Composite par)
-    {
-        setTitle("Add Library");
-        Composite container = (Composite) super.createDialogArea(par);
-
-        Composite topPanel = new Composite(container, SWT.NONE);
-
-        new Label(topPanel, SWT.NONE).setText("Name");
-
-        txtName = new Text(topPanel, SWT.BORDER);
-        txtName.setEditable(!editOnly);
-        if (name != null)
-            txtName.setText(name);
-
-        new Label(topPanel, SWT.NONE).setText("Version");
-
-        txtVersion = new Text(topPanel, SWT.BORDER);
-        txtVersion.setText(version.toString());
-        txtVersion.setEditable(!editOnly);
-
-        Composite bottomPanel = new Composite(container, SWT.NONE);
-
-        Table table = new Table(bottomPanel, SWT.BORDER);
-        table.setSize(new Point(300, 200));
-
-        Button add = new Button(bottomPanel, SWT.PUSH);
-        add.setText("Add...");
-
-        final Button edit = new Button(bottomPanel, SWT.PUSH);
-        edit.setText("Edit...");
-        edit.setEnabled(false);
-
-        final Button remove = new Button(bottomPanel, SWT.PUSH);
-        remove.setText("Remove");
-        remove.setEnabled(false);
-
-        updateState();
-
-        // Hookup Listeners
-        txtName.addModifyListener(new ModifyListener()
-        {
-            public void modifyText(ModifyEvent e)
-            {
-                updateState();
-            }
-        });
-        txtVersion.addModifyListener(new ModifyListener()
-        {
-            public void modifyText(ModifyEvent e)
-            {
-                updateState();
-            }
-        });
-        add.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleAdd();
-            }
-        });
-        edit.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleEdit();
-            }
-        });
-        remove.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleRemove();
-            }
-        });
-
-        // Layout
-        topPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        topPanel.setLayout(new GridLayout(2, false));
-        txtName.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        txtVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
-        bottomPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-        bottomPanel.setLayout(new GridLayout(2, false));
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 4));
-        add.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-        edit.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-        remove.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-
-        // Table Viewer
-        viewer = new TableViewer(table);
-        viewer.setLabelProvider(new LabelProvider()
-        {
-            @Override
-            public String getText(Object element)
-            {
-                IPackageImport pi = (IPackageImport) element;
-                return pi.getPackageName() + " " + pi.getVersions();
-            }
-        });
-        viewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                edit.setEnabled(!event.getSelection().isEmpty());
-                remove.setEnabled(!event.getSelection().isEmpty());
-            }
-        });
-        viewer.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return toArray(inputElement);
-            }
-        });
-
-        viewer.setInput(packageImports);
-        return container;
-    }
-
-    private void updateState()
-    {
-        String error = null;
-        String warning = null;
-
-        name = txtName.getText();
-
-        try
-        {
-            version = VersionTable.getVersion(txtVersion.getText());
-            if (version.getQualifier().indexOf('_') > -1)
-            {
-                warning = "The use of underscores in a version qualifier is discouraged.";
-            }
-        }
-        catch (IllegalArgumentException e)
-        {
-            version = null;
-            error = "Invalid version format";
-        }
-
-        Button okButton = getButton(IDialogConstants.OK_ID);
-        if (okButton != null && !okButton.isDisposed())
-            okButton.setEnabled(allowOkay());
-
-        setErrorMessage(error);
-        setMessage(warning, IMessageProvider.WARNING);
-    }
-
-    private boolean allowOkay()
-    {
-        return name != null && name.length() > 0 && version != null;
-    }
-
-    @Override
-    protected Button createButton(Composite parent, int id, String label,
-        boolean defaultButton)
-    {
-        Button button = super.createButton(parent, id, label, defaultButton);
-        if (id == IDialogConstants.OK_ID)
-        {
-            button.setEnabled(allowOkay());
-        }
-        return button;
-    }
-
-    private void handleAdd()
-    {
-        /*NewResourceSelectionDialog<? extends IPackageModelElement> dialog = ResourcesDialogHelper.createImportDialog(getShell(), "Add Imported Package", null, packageImports);
-        if ( dialog.open() == Window.OK ) {
-        	IPackageImport pi = ModelElementFactory.getInstance().newModelElement(IPackageImport.class);
-        	pi.setPackageName(dialog.getSelectedName());
-        	pi.setVersions(dialog.getSelectedVersions());
-        	pi.setOptional(dialog.isOptional());
-        	
-        	packageImports.add(pi);
-        	viewer.refresh();
-        }*/
-    }
-
-    private void handleEdit()
-    {
-        /*IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-        
-        boolean changed = false;
-        
-        if ( !selection.isEmpty() ) {
-        	for ( Iterator<IPackageImport> i = selection.iterator(); i.hasNext(); ) {	
-        		IPackageImport packageImport = i.next();
-        		NewResourceSelectionDialog<? extends IPackageModelElement> dialog = ResourcesDialogHelper.createImportDialog( getShell(), "Edit Imported Package", packageImport, packageImports );
-        		dialog.setVersions( packageImport.getVersions() );
-        		dialog.setOptional(packageImport.isOptional());
-        		if ( dialog.open() == Window.OK ) {
-        			changed = true;
-        			String packageName = dialog.getSelectedName();
-        			VersionRange versionRange = dialog.getSelectedVersions();
-        			
-        			IPackageImport newImport = ModelElementFactory.getInstance().newModelElement(IPackageImport.class);
-        			newImport.setPackageName(packageName);
-        			newImport.setVersions(versionRange);
-        			newImport.setOptional(dialog.isOptional());
-        			
-        			packageImports.remove(packageImport);
-        			packageImports.add(newImport);
-        		}
-        	}
-        }
-        
-        if ( changed ) {
-        	viewer.refresh();
-        } */
-    }
-
-    @SuppressWarnings("unchecked")
-    private void handleRemove()
-    {
-        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-
-        if (!selection.isEmpty())
-        {
-            for (Iterator<IPackageImport> i = selection.iterator(); i.hasNext();)
-            {
-                packageImports.remove(i.next());
-            }
-
-            viewer.refresh();
-        }
-    }
-
-    public ILibrary getLibrary()
-    {
-        ILibrary library = ModelElementFactory.getInstance().newModelElement(
-            ILibrary.class);
-
-        library.setName(name);
-        library.setVersion(version);
-
-        for (IPackageImport pi : packageImports)
-        {
-            library.addImport(pi);
-        }
-
-        return library;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/LibraryPreferencePage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/LibraryPreferencePage.java
deleted file mode 100644
index a93cd33..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/LibraryPreferencePage.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences;
-
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.TreeSet;
-
-import org.apache.felix.sigil.common.model.eclipse.ILibrary;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class LibraryPreferencePage extends PreferencePage implements IWorkbenchPreferencePage
-{
-
-    private TreeSet<ILibrary> libraries;
-    private TableViewer libraryView;
-
-    private Table table;
-    private Button btnAdd;
-    private Button btnEdit;
-    private Button btnRemove;
-
-    public void init(IWorkbench workbench)
-    {
-    }
-
-    @Override
-    protected Control createContents(Composite parent)
-    {
-        Control control = initContents(parent);
-        loadPreferences();
-        return control;
-    }
-
-    @Override
-    protected IPreferenceStore doGetPreferenceStore()
-    {
-        return SigilCore.getDefault().getPreferenceStore();
-    }
-
-    @Override
-    protected void performDefaults()
-    {
-        super.performDefaults();
-    }
-
-    @Override
-    public boolean performOk()
-    {
-        IPreferenceStore prefs = getPreferenceStore();
-        for (String key : prefs.getString(SigilCore.LIBRARY_KEYS_PREF).split(","))
-        {
-            prefs.setToDefault(key);
-        }
-
-        StringBuffer keys = new StringBuffer();
-
-        for (ILibrary lib : libraries)
-        {
-            throw new IllegalStateException("XXX-FIXME-XXX");
-        }
-
-        prefs.setValue(SigilCore.LIBRARY_KEYS_PREF, keys.toString());
-
-        return true;
-    }
-
-    private Control initContents(Composite parent)
-    {
-        Composite control = new Composite(parent, SWT.NONE);
-        control.setFont(parent.getFont());
-
-        GridLayout grid = new GridLayout(3, false);
-        control.setLayout(grid);
-
-        initRepositories(control);
-
-        return control;
-    }
-
-    private void initRepositories(Composite composite)
-    {
-        // Create controls
-        new Label(composite, SWT.NONE).setText("Libraries:");
-        new Label(composite, SWT.NONE); // Spacer
-        table = new Table(composite, SWT.SINGLE | SWT.BORDER);
-        //table.setFont(control.getFont());
-        btnAdd = new Button(composite, SWT.PUSH);
-        btnAdd.setText("Add...");
-        //add.setFont(control.getFont());
-        btnEdit = new Button(composite, SWT.PUSH);
-        btnEdit.setText("Edit...");
-        //edit.setFont(control.getFont());
-        btnRemove = new Button(composite, SWT.PUSH);
-        btnRemove.setText("Remove");
-        //remove.setFont(control.getFont());
-
-        // Table Model
-        libraries = new TreeSet<ILibrary>(new Comparator<ILibrary>()
-        {
-            public int compare(ILibrary l1, ILibrary l2)
-            {
-                int c = l1.getName().compareTo(l2.getName());
-                if (c == 0)
-                {
-                    c = l1.getVersion().compareTo(l2.getVersion());
-                }
-                return c;
-            }
-        });
-        libraryView = new TableViewer(table);
-        libraryView.setLabelProvider(new LabelProvider()
-        {
-            public String getText(Object element)
-            {
-                ILibrary rep = (ILibrary) element;
-                return rep.getName() + " " + rep.getVersion();
-            }
-        });
-        libraryView.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return toArray(inputElement);
-            }
-        });
-        libraryView.setInput(libraries);
-
-        // Initialize controls
-        updateButtonStates();
-
-        // Hookup Listeners
-        libraryView.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateButtonStates();
-            }
-        });
-        btnAdd.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleAdd();
-            }
-        });
-        btnEdit.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleEdit();
-            }
-        });
-        btnRemove.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleRemove();
-            }
-        });
-
-        // Layout
-        composite.setLayout(new GridLayout(2, false));
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 4));
-        GridDataFactory buttonGD = GridDataFactory.swtDefaults().align(SWT.FILL,
-            SWT.CENTER);
-        btnAdd.setLayoutData(buttonGD.create());
-        btnEdit.setLayoutData(buttonGD.create());
-        btnRemove.setLayoutData(buttonGD.create());
-    }
-
-    private void updateButtonStates()
-    {
-        ISelection sel = libraryView.getSelection();
-        btnEdit.setEnabled(!sel.isEmpty());
-        btnRemove.setEnabled(!sel.isEmpty());
-    }
-
-    private void handleAdd()
-    {
-        LibraryConfigurationDialog d = new LibraryConfigurationDialog(getShell());
-        if (d.open() == Window.OK)
-        {
-            libraries.add(d.getLibrary());
-            libraryView.refresh();
-        }
-    }
-
-    private void handleEdit()
-    {
-        IStructuredSelection sel = (IStructuredSelection) libraryView.getSelection();
-        boolean change = false;
-
-        for (@SuppressWarnings("unchecked")
-        Iterator<ILibrary> i = sel.iterator(); i.hasNext();)
-        {
-            ILibrary lib = i.next();
-            LibraryConfigurationDialog d = new LibraryConfigurationDialog(getShell(), lib);
-            if (d.open() == Window.OK)
-            {
-                libraries.remove(lib);
-                libraries.add(d.getLibrary());
-                change = true;
-            }
-        }
-
-        if (change)
-        {
-            libraryView.refresh();
-        }
-    }
-
-    private void handleRemove()
-    {
-        IStructuredSelection sel = (IStructuredSelection) libraryView.getSelection();
-        for (@SuppressWarnings("unchecked")
-        Iterator<ILibrary> i = sel.iterator(); i.hasNext();)
-        {
-            libraries.remove(i);
-        }
-        libraryView.refresh();
-    }
-
-    private void loadPreferences()
-    {
-        IPreferenceStore prefs = getPreferenceStore();
-        String keys = prefs.getString(SigilCore.LIBRARY_KEYS_PREF);
-        if (keys.trim().length() > 0)
-        {
-            for (String key : keys.split(","))
-            {
-                String libStr = prefs.getString(key);
-                // XXX-FIXME-XXX parse library string
-                // lib = parse(libstr);
-                // libraries.add(lib);
-            }
-            libraryView.refresh();
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/OptionalPrompt.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/OptionalPrompt.java
deleted file mode 100644
index 2b5f22f..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/OptionalPrompt.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.preferences.PromptablePreference;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Shell;
-
-public class OptionalPrompt
-{
-    public static boolean optionallyPrompt(String prefName, String title, String text,
-        Shell parentShell)
-    {
-        return optionallyPrompt(SigilCore.getDefault().getPreferenceStore(), prefName,
-            title, text, parentShell);
-    }
-
-    public static boolean optionallyPrompt(IPreferenceStore prefStore, String prefName,
-        String title, String text, Shell parentShell)
-    {
-        boolean result = false;
-
-        PromptablePreference value = preference(prefStore, prefName);
-        switch (value)
-        {
-            case Always:
-                result = true;
-                break;
-            case Never:
-                result = false;
-                break;
-            case Prompt:
-                MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoQuestion(
-                    parentShell, title, text, "Do not ask this again", false, null, null);
-                result = (dialog.getReturnCode() == IDialogConstants.YES_ID);
-                if (dialog.getToggleState())
-                {
-                    // User said don't ask again... take the current answer as the new preference
-                    prefStore.setValue(prefName,
-                        result ? PromptablePreference.Always.name()
-                            : PromptablePreference.Never.name());
-                }
-        }
-
-        return result;
-    }
-
-    public static int optionallyPromptWithCancel(String prefName, String title,
-        String text, Shell parentShell)
-    {
-        return optionallyPromptWithCancel(SigilCore.getDefault().getPreferenceStore(),
-            prefName, title, text, parentShell);
-    }
-
-    public static int optionallyPromptWithCancel(IPreferenceStore prefStore,
-        String prefName, String title, String text, Shell parentShell)
-    {
-        int result = IDialogConstants.NO_ID;
-
-        PromptablePreference value = preference(prefStore, prefName);
-        switch (value)
-        {
-            case Always:
-                result = IDialogConstants.YES_ID;
-                break;
-            case Never:
-                result = IDialogConstants.NO_ID;
-                break;
-            case Prompt:
-                MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoCancelQuestion(
-                    parentShell, title, text, "Do not ask this again", false, null, null);
-                result = dialog.getReturnCode();
-                if (result != IDialogConstants.CANCEL_ID)
-                {
-                    if (dialog.getToggleState())
-                    {
-                        // User said don't ask again... take the current answer as the new preference
-                        prefStore.setValue(
-                            prefName,
-                            (result == IDialogConstants.YES_ID) ? PromptablePreference.Always.name()
-                                : PromptablePreference.Never.name());
-                    }
-                }
-        }
-
-        return result;
-    }
-
-    /**
-     * @param prefStore 
-     * @param prefName
-     * @return
-     */
-    private static PromptablePreference preference(IPreferenceStore prefStore,
-        String prefName)
-    {
-        String val = prefStore.getString(prefName);
-        return (val == null || val.trim().length() == 0) ? PromptablePreference.Prompt
-            : PromptablePreference.valueOf(val);
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/ProjectDependentPreferencesPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/ProjectDependentPreferencesPage.java
deleted file mode 100644
index b738194..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/ProjectDependentPreferencesPage.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences;
-
-import org.apache.felix.sigil.eclipse.ui.util.ProjectUtils;
-import org.eclipse.jface.preference.PreferencePage;
-
-public abstract class ProjectDependentPreferencesPage extends PreferencePage
-{
-
-    public ProjectDependentPreferencesPage(String title)
-    {
-        super(title);
-    }
-
-    @Override
-    public boolean performOk()
-    {
-        if (isDirty())
-        {
-            return ProjectUtils.runTaskWithRebuildCheck(new Runnable()
-            {
-                public void run()
-                {
-                    doSave();
-                }
-
-            }, getShell());
-        }
-        else
-        {
-            return true;
-        }
-    }
-
-    protected abstract void doSave();
-
-    protected abstract boolean isDirty();
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/SigilPreferencePage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/SigilPreferencePage.java
deleted file mode 100644
index 6f68eb4..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/SigilPreferencePage.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.preferences.PromptablePreference;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class SigilPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage
-{
-
-    @Override
-    protected void createFieldEditors()
-    {
-        RadioGroupFieldEditor impExpField = new RadioGroupFieldEditor(
-            SigilCore.PREFERENCES_ADD_IMPORT_FOR_EXPORT, "Add Imports for New Exports",
-            1, new String[][] {
-                    new String[] { "Always (Recommended)",
-                            PromptablePreference.Always.toString() },
-                    new String[] { "Prompt", PromptablePreference.Prompt.toString() },
-                    new String[] { "Never", PromptablePreference.Never.toString() } },
-            getFieldEditorParent(), true);
-
-        addField(impExpField);
-
-        RadioGroupFieldEditor rebuildExpField = new RadioGroupFieldEditor(
-            SigilCore.PREFERENCES_REBUILD_PROJECTS, "Rebuild Projects On Install Change",
-            1, new String[][] {
-                    new String[] { "Always (Recommended)",
-                            PromptablePreference.Always.toString() },
-                    new String[] { "Prompt", PromptablePreference.Prompt.toString() },
-                    new String[] { "Never", PromptablePreference.Never.toString() } },
-            getFieldEditorParent(), true);
-
-        addField(rebuildExpField);
-    }
-
-    @Override
-    protected IPreferenceStore doGetPreferenceStore()
-    {
-        return SigilCore.getDefault().getPreferenceStore();
-    }
-
-    public void init(IWorkbench workbench)
-    {
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/VersionsPreferencePage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/VersionsPreferencePage.java
deleted file mode 100644
index c59729b..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/VersionsPreferencePage.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences;
-
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.osgi.VersionRangeBoundingRule;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.osgi.framework.Version;
-
-public class VersionsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage
-{
-
-    private static final Version SAMPLE_VERSION = VersionTable.getVersion(1, 2, 3,
-        "qualifier");
-
-    private Button btnLowerBoundExact;
-    private Button btnLowerBoundMicro;
-    private Button btnLowerBoundMinor;
-    private Button btnLowerBoundMajor;
-    private Button btnLowerBoundAny;
-
-    private Button btnUpperBoundExact;
-    private Button btnUpperBoundMicro;
-    private Button btnUpperBoundMinor;
-    private Button btnUpperBoundMajor;
-    private Button btnUpperBoundAny;
-
-    private Text txtSampleVersion;
-    private Label lblCalculatedRange;
-    private Text txtMatchVersion;
-    private Label lblMatchResult;
-
-    private VersionRangeBoundingRule lowerBoundRule;
-    private VersionRangeBoundingRule upperBoundRule;
-
-    private Version sampleVersion = SAMPLE_VERSION;
-    private Version matchVersion = null;
-
-    public VersionsPreferencePage()
-    {
-        super();
-        setDescription("Specify the Lower and Upper bounds for a default version range calculated from a point version, e.g. \"1.2.3.qualifier\"");
-    }
-
-    @Override
-    protected Control createContents(Composite parent)
-    {
-        // Create controls
-        Composite composite = new Composite(parent, SWT.NONE);
-
-        Group grpLowerBound = new Group(composite, SWT.NONE);
-        grpLowerBound.setText("Lower Bound");
-        btnLowerBoundExact = new Button(grpLowerBound, SWT.RADIO);
-        btnLowerBoundExact.setText("Exact e.g. [1.2.3.qualifer, ...)");
-        btnLowerBoundMicro = new Button(grpLowerBound, SWT.RADIO);
-        btnLowerBoundMicro.setText("Micro e.g. [1.2.3, ...)");
-        btnLowerBoundMinor = new Button(grpLowerBound, SWT.RADIO);
-        btnLowerBoundMinor.setText("Minor e.g. [1.2, ...)");
-        btnLowerBoundMajor = new Button(grpLowerBound, SWT.RADIO);
-        btnLowerBoundMajor.setText("Major e.g. [1, ...)");
-        btnLowerBoundAny = new Button(grpLowerBound, SWT.RADIO);
-        btnLowerBoundAny.setText("Any e.g. [0, ...)");
-
-        Group grpUpperBound = new Group(composite, SWT.NONE);
-        grpUpperBound.setText("Upper Bound");
-
-        btnUpperBoundExact = new Button(grpUpperBound, SWT.RADIO);
-        btnUpperBoundExact.setText("Exact e.g. [..., 1.2.3.qualifer]");
-        btnUpperBoundMicro = new Button(grpUpperBound, SWT.RADIO);
-        btnUpperBoundMicro.setText("Micro e.g. [..., 1.2.4)");
-        btnUpperBoundMinor = new Button(grpUpperBound, SWT.RADIO);
-        btnUpperBoundMinor.setText("Minor e.g. [..., 1.3)");
-        btnUpperBoundMajor = new Button(grpUpperBound, SWT.RADIO);
-        btnUpperBoundMajor.setText("Major e.g. [..., 2)");
-        btnUpperBoundAny = new Button(grpUpperBound, SWT.RADIO);
-        btnUpperBoundAny.setText("Any e.g. [..., \u221e)");
-
-        Group grpRangeTest = new Group(composite, SWT.NONE);
-        grpRangeTest.setText("Range Test");
-        new Label(grpRangeTest, SWT.NONE).setText("Sample Input Version: ");
-        txtSampleVersion = new Text(grpRangeTest, SWT.BORDER);
-        new Label(grpRangeTest, SWT.NONE).setText("Calculated Version Range: ");
-        lblCalculatedRange = new Label(grpRangeTest, SWT.NONE);
-
-        new Label(grpRangeTest, SWT.NONE).setText("Test: ");
-        txtMatchVersion = new Text(grpRangeTest, SWT.BORDER);
-        new Label(grpRangeTest, SWT.NONE).setText("Result: ");
-        lblMatchResult = new Label(grpRangeTest, SWT.NONE);
-
-        // Initialize controls
-        loadPreferences(false);
-        updateRadioButtons();
-
-        txtSampleVersion.setText(sampleVersion.toString());
-        updateCalculatedRange();
-
-        // Add listeners
-        SelectionListener buttonListener = new SelectionListener()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                readRadioButtons();
-                updateCalculatedRange();
-            }
-
-            public void widgetDefaultSelected(SelectionEvent e)
-            {
-                readRadioButtons();
-                updateCalculatedRange();
-            }
-        };
-        btnLowerBoundAny.addSelectionListener(buttonListener);
-        btnLowerBoundMajor.addSelectionListener(buttonListener);
-        btnLowerBoundMinor.addSelectionListener(buttonListener);
-        btnLowerBoundMicro.addSelectionListener(buttonListener);
-        btnLowerBoundExact.addSelectionListener(buttonListener);
-
-        btnUpperBoundAny.addSelectionListener(buttonListener);
-        btnUpperBoundMajor.addSelectionListener(buttonListener);
-        btnUpperBoundMinor.addSelectionListener(buttonListener);
-        btnUpperBoundMicro.addSelectionListener(buttonListener);
-        btnUpperBoundExact.addSelectionListener(buttonListener);
-
-        txtSampleVersion.addModifyListener(new ModifyListener()
-        {
-            public void modifyText(ModifyEvent e)
-            {
-                try
-                {
-                    sampleVersion = VersionTable.getVersion(txtSampleVersion.getText());
-                }
-                catch (IllegalArgumentException x)
-                {
-                    sampleVersion = null;
-                }
-                updateCalculatedRange();
-            }
-        });
-        txtMatchVersion.addModifyListener(new ModifyListener()
-        {
-            public void modifyText(ModifyEvent e)
-            {
-                try
-                {
-                    matchVersion = VersionTable.getVersion(txtMatchVersion.getText());
-                }
-                catch (IllegalArgumentException x)
-                {
-                    matchVersion = null;
-                }
-                updateCalculatedRange();
-            }
-        });
-
-        // Layout
-        GridLayout layout = new GridLayout(1, false);
-        layout.verticalSpacing = 20;
-        composite.setLayout(layout);
-
-        grpLowerBound.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-        grpLowerBound.setLayout(new GridLayout(1, false));
-
-        grpUpperBound.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-        grpUpperBound.setLayout(new GridLayout(1, false));
-
-        grpRangeTest.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true));
-        grpRangeTest.setLayout(new GridLayout(2, false));
-
-        txtSampleVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        lblCalculatedRange.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        txtMatchVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        lblMatchResult.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
-        return composite;
-    }
-
-    private void loadPreferences(boolean useDefaults)
-    {
-        IPreferenceStore prefs = getPreferenceStore();
-        String lowerBoundStr;
-        if (useDefaults)
-        {
-            lowerBoundStr = prefs.getDefaultString(SigilCore.DEFAULT_VERSION_LOWER_BOUND);
-        }
-        else
-        {
-            lowerBoundStr = prefs.getString(SigilCore.DEFAULT_VERSION_LOWER_BOUND);
-        }
-
-        String upperBoundStr;
-        if (useDefaults)
-        {
-            upperBoundStr = prefs.getDefaultString(SigilCore.DEFAULT_VERSION_UPPER_BOUND);
-        }
-        else
-        {
-            upperBoundStr = prefs.getString(SigilCore.DEFAULT_VERSION_UPPER_BOUND);
-        }
-
-        lowerBoundRule = VersionRangeBoundingRule.valueOf(lowerBoundStr);
-        upperBoundRule = VersionRangeBoundingRule.valueOf(upperBoundStr);
-    }
-
-    private void updateRadioButtons()
-    {
-        switch (lowerBoundRule)
-        {
-            case Exact:
-                btnLowerBoundExact.setSelection(true);
-                btnLowerBoundMicro.setSelection(false);
-                btnLowerBoundMinor.setSelection(false);
-                btnLowerBoundMajor.setSelection(false);
-                btnLowerBoundAny.setSelection(false);
-                break;
-            case Micro:
-                btnLowerBoundExact.setSelection(false);
-                btnLowerBoundMicro.setSelection(true);
-                btnLowerBoundMinor.setSelection(false);
-                btnLowerBoundMajor.setSelection(false);
-                btnLowerBoundAny.setSelection(false);
-                break;
-            case Minor:
-                btnLowerBoundExact.setSelection(false);
-                btnLowerBoundMicro.setSelection(false);
-                btnLowerBoundMinor.setSelection(true);
-                btnLowerBoundMajor.setSelection(false);
-                btnLowerBoundAny.setSelection(false);
-                break;
-            case Major:
-                btnLowerBoundExact.setSelection(false);
-                btnLowerBoundMicro.setSelection(false);
-                btnLowerBoundMinor.setSelection(false);
-                btnLowerBoundMajor.setSelection(true);
-                btnLowerBoundAny.setSelection(false);
-                break;
-            case Any:
-                btnLowerBoundExact.setSelection(false);
-                btnLowerBoundMicro.setSelection(false);
-                btnLowerBoundMinor.setSelection(false);
-                btnLowerBoundMajor.setSelection(false);
-                btnLowerBoundAny.setSelection(true);
-                break;
-        }
-
-        switch (upperBoundRule)
-        {
-            case Exact:
-                btnUpperBoundExact.setSelection(true);
-                btnUpperBoundMicro.setSelection(false);
-                btnUpperBoundMinor.setSelection(false);
-                btnUpperBoundMajor.setSelection(false);
-                btnUpperBoundAny.setSelection(false);
-                break;
-            case Micro:
-                btnUpperBoundExact.setSelection(false);
-                btnUpperBoundMicro.setSelection(true);
-                btnUpperBoundMinor.setSelection(false);
-                btnUpperBoundMajor.setSelection(false);
-                btnUpperBoundAny.setSelection(false);
-                break;
-            case Minor:
-                btnUpperBoundExact.setSelection(false);
-                btnUpperBoundMicro.setSelection(false);
-                btnUpperBoundMinor.setSelection(true);
-                btnUpperBoundMajor.setSelection(false);
-                btnUpperBoundAny.setSelection(false);
-                break;
-            case Major:
-                btnUpperBoundExact.setSelection(false);
-                btnUpperBoundMicro.setSelection(false);
-                btnUpperBoundMinor.setSelection(false);
-                btnUpperBoundMajor.setSelection(true);
-                btnUpperBoundAny.setSelection(false);
-                break;
-            case Any:
-                btnUpperBoundExact.setSelection(false);
-                btnUpperBoundMicro.setSelection(false);
-                btnUpperBoundMinor.setSelection(false);
-                btnUpperBoundMajor.setSelection(false);
-                btnUpperBoundAny.setSelection(true);
-        }
-    }
-
-    private void readRadioButtons()
-    {
-        if (btnLowerBoundExact.getSelection())
-        {
-            lowerBoundRule = VersionRangeBoundingRule.Exact;
-        }
-        else if (btnLowerBoundMicro.getSelection())
-        {
-            lowerBoundRule = VersionRangeBoundingRule.Micro;
-        }
-        else if (btnLowerBoundMinor.getSelection())
-        {
-            lowerBoundRule = VersionRangeBoundingRule.Minor;
-        }
-        else if (btnLowerBoundMajor.getSelection())
-        {
-            lowerBoundRule = VersionRangeBoundingRule.Major;
-        }
-        else if (btnLowerBoundAny.getSelection())
-        {
-            lowerBoundRule = VersionRangeBoundingRule.Any;
-        }
-
-        if (btnUpperBoundExact.getSelection())
-        {
-            upperBoundRule = VersionRangeBoundingRule.Exact;
-        }
-        else if (btnUpperBoundMicro.getSelection())
-        {
-            upperBoundRule = VersionRangeBoundingRule.Micro;
-        }
-        else if (btnUpperBoundMinor.getSelection())
-        {
-            upperBoundRule = VersionRangeBoundingRule.Minor;
-        }
-        else if (btnUpperBoundMajor.getSelection())
-        {
-            upperBoundRule = VersionRangeBoundingRule.Major;
-        }
-        else if (btnUpperBoundAny.getSelection())
-        {
-            upperBoundRule = VersionRangeBoundingRule.Any;
-        }
-    }
-
-    private void updateCalculatedRange()
-    {
-        VersionRange range;
-        String rangeStr;
-        String matchResult;
-
-        if (sampleVersion == null)
-        {
-            range = null;
-            rangeStr = "";
-        }
-        else
-        {
-            range = VersionRange.newInstance(sampleVersion, lowerBoundRule,
-                upperBoundRule);
-            rangeStr = range.toString();
-        }
-        lblCalculatedRange.setText(rangeStr);
-
-        if (matchVersion == null || range == null)
-        {
-            matchResult = "";
-        }
-        else
-        {
-            matchResult = range.contains(matchVersion) ? "MATCH!" : "No Match";
-        }
-        lblMatchResult.setText(matchResult);
-    }
-
-    public void init(IWorkbench workbench)
-    {
-    }
-
-    @Override
-    protected IPreferenceStore doGetPreferenceStore()
-    {
-        return SigilCore.getDefault().getPreferenceStore();
-    }
-
-    @Override
-    public boolean performOk()
-    {
-        getPreferenceStore().setValue(SigilCore.DEFAULT_VERSION_LOWER_BOUND,
-            lowerBoundRule.name());
-        getPreferenceStore().setValue(SigilCore.DEFAULT_VERSION_UPPER_BOUND,
-            upperBoundRule.name());
-
-        return true;
-    }
-
-    @Override
-    protected void performDefaults()
-    {
-        super.performDefaults();
-        loadPreferences(true);
-        updateRadioButtons();
-        updateCalculatedRange();
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/installs/OSGiInstallsPreferencePage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/installs/OSGiInstallsPreferencePage.java
deleted file mode 100644
index 14dbe83..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/installs/OSGiInstallsPreferencePage.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences.installs;
-
-import java.util.HashMap;
-import java.util.UUID;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.install.IOSGiInstallType;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.internal.preferences.ProjectDependentPreferencesPage;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class OSGiInstallsPreferencePage extends ProjectDependentPreferencesPage implements IWorkbenchPreferencePage
-{
-
-    private class Install
-    {
-        private String id;
-        private String location;
-        private IOSGiInstallType type;
-
-        private Install(String id, String location)
-        {
-            this.id = id;
-            this.location = location;
-        }
-
-        private IOSGiInstallType getType()
-        {
-            if (type == null)
-            {
-                type = SigilCore.getInstallManager().findInstallType(location);
-            }
-            return type;
-        }
-    }
-
-    private HashMap<String, Install> installs = new HashMap<String, Install>();
-    private CheckboxTableViewer viewer;
-    private boolean changed;
-
-    public OSGiInstallsPreferencePage()
-    {
-        super("OSGi Installs");
-    }
-
-    public void init(IWorkbench workbench)
-    {
-    }
-
-    @Override
-    protected Control createContents(Composite parent)
-    {
-        Composite control = new Composite(parent, SWT.NONE);
-
-        buildComponents(control);
-
-        load();
-
-        checkValid();
-
-        return control;
-    }
-
-    @Override
-    protected boolean isDirty()
-    {
-        return changed;
-    }
-
-    private void buildComponents(Composite control)
-    {
-        new Label(control, SWT.NONE).setText("Installs:");
-        new Label(control, SWT.NONE); // padding
-
-        Table table = new Table(control, SWT.CHECK | SWT.SINGLE | SWT.BORDER);
-
-        Button add = new Button(control, SWT.PUSH);
-        add.setText("Add");
-        add.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                add();
-            }
-        });
-
-        final Button remove = new Button(control, SWT.PUSH);
-        remove.setEnabled(false);
-        remove.setText("Remove");
-        remove.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                remove();
-            }
-        });
-
-        // viewers
-        viewer = new CheckboxTableViewer(table);
-        viewer.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return toArray(inputElement);
-            }
-        });
-
-        viewer.setLabelProvider(new LabelProvider()
-        {
-            @Override
-            public String getText(Object element)
-            {
-                Install i = (Install) element;
-                IOSGiInstallType type = i.getType();
-                if (type == null)
-                {
-                    return "<invalid> [" + i.location + "]";
-                }
-                else
-                {
-                    return type.getName() + " " + type.getVersion() + " [" + i.location
-                        + "]";
-                }
-            }
-
-            @Override
-            public Image getImage(Object element)
-            {
-                Install i = (Install) element;
-                IOSGiInstallType type = i.getType();
-
-                if (type == null)
-                {
-                    return null;
-                }
-                else
-                {
-                    return type.getIcon();
-                }
-            }
-        });
-
-        viewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                boolean enabled = !event.getSelection().isEmpty();
-                remove.setEnabled(enabled);
-            }
-        });
-
-        viewer.addCheckStateListener(new ICheckStateListener()
-        {
-            public void checkStateChanged(CheckStateChangedEvent event)
-            {
-                if (event.getChecked())
-                {
-                    changed = true;
-                }
-                viewer.setCheckedElements(new Object[] { event.getElement() });
-            }
-        });
-
-        viewer.setInput(installs.values());
-
-        // layout
-        control.setLayout(new GridLayout(2, false));
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3));
-        add.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-        remove.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-    }
-
-    private void load()
-    {
-        String pref = getPreferenceStore().getString(SigilCore.OSGI_INSTALLS);
-        if (pref != null && pref.length() > 0)
-        {
-            for (String id : pref.split(","))
-            {
-                String loc = getPreferenceStore().getString(
-                    SigilCore.OSGI_INSTALL_PREFIX + id);
-                installs.put(id, new Install(id, loc));
-            }
-        }
-
-        viewer.refresh();
-
-        if (!installs.isEmpty())
-        {
-            String defId = getPreferenceStore().getString(
-                SigilCore.OSGI_DEFAULT_INSTALL_ID);
-            if (defId == null || defId.trim().length() == 0)
-            {
-                viewer.setCheckedElements(new Object[] { installs.values().iterator().next() });
-            }
-            else
-            {
-                viewer.setCheckedElements(new Object[] { installs.get(defId) });
-            }
-        }
-    }
-
-    protected void doSave()
-    {
-        // zero out old configs
-        String pref = getPreferenceStore().getString(SigilCore.OSGI_INSTALLS);
-        if (pref != null && pref.length() > 0)
-        {
-            for (String id : pref.split(","))
-            {
-                getPreferenceStore().setToDefault(SigilCore.OSGI_INSTALL_PREFIX + id);
-            }
-        }
-
-        // store new configs
-        if (installs.isEmpty())
-        {
-            getPreferenceStore().setToDefault(SigilCore.OSGI_INSTALLS);
-            getPreferenceStore().setToDefault(SigilCore.OSGI_DEFAULT_INSTALL_ID);
-        }
-        else
-        {
-            StringBuffer buf = new StringBuffer();
-            for (Install i : installs.values())
-            {
-                if (buf.length() > 0)
-                {
-                    buf.append(",");
-                }
-                buf.append(i.id);
-                getPreferenceStore().setValue(SigilCore.OSGI_INSTALL_PREFIX + i.id,
-                    i.location);
-            }
-
-            getPreferenceStore().setValue(SigilCore.OSGI_INSTALLS, buf.toString());
-            Install def = (Install) viewer.getCheckedElements()[0];
-            getPreferenceStore().setValue(SigilCore.OSGI_DEFAULT_INSTALL_ID, def.id);
-        }
-        changed = false;
-    }
-
-    private boolean isOK()
-    {
-        return installs.isEmpty() || viewer.getCheckedElements().length > 0;
-    }
-
-    private void add()
-    {
-        Shell shell = SigilUI.getActiveWorkbenchShell();
-        DirectoryDialog dialog = new DirectoryDialog(shell);
-        String dir = dialog.open();
-        if (dir != null)
-        {
-            Install install = new Install(UUID.randomUUID().toString(), dir);
-            if (install.getType() == null)
-            {
-                MessageDialog.openError(shell, "Error", "Invalid OSGi install directory");
-            }
-            else
-            {
-                boolean empty = installs.isEmpty();
-
-                installs.put(install.id, install);
-                viewer.refresh();
-
-                if (empty)
-                {
-                    viewer.setCheckedElements(new Object[] { install });
-                }
-
-                checkValid();
-                changed = true;
-            }
-        }
-    }
-
-    private void checkValid()
-    {
-        if (isOK())
-        {
-            setErrorMessage(null);
-            setValid(true);
-        }
-        else
-        {
-            setErrorMessage("Missing default OSGi install");
-            setValid(false);
-        }
-    }
-
-    private void remove()
-    {
-        IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
-        Install i = (Install) sel.getFirstElement();
-        boolean def = viewer.getChecked(i);
-        installs.remove(i.id);
-        viewer.refresh();
-        if (def && installs.size() > 0)
-        {
-            viewer.setCheckedElements(new Object[] { installs.values().iterator().next() });
-        }
-        checkValid();
-        changed = true;
-    }
-
-    @Override
-    protected IPreferenceStore doGetPreferenceStore()
-    {
-        return SigilCore.getDefault().getPreferenceStore();
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/NewRepositoryWizard.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/NewRepositoryWizard.java
deleted file mode 100644
index 0e5935e..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/NewRepositoryWizard.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;
-
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.eclipse.jface.wizard.Wizard;
-
-public class NewRepositoryWizard extends Wizard
-{
-
-    private IRepositoryModel repository;
-
-    private RepositoryTypeSelectionPage page = new RepositoryTypeSelectionPage();
-
-    public void addPages()
-    {
-        addPage(page);
-    }
-
-    @Override
-    public boolean performFinish()
-    {
-        repository = page.getRepository();
-        return true;
-    }
-
-    @Override
-    public boolean needsPreviousAndNextButtons()
-    {
-        return true;
-    }
-
-    public IRepositoryModel getRepository()
-    {
-        return repository;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesPreferencePage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesPreferencePage.java
deleted file mode 100644
index 0ad5e38..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesPreferencePage.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryPreferences;
-import org.apache.felix.sigil.eclipse.ui.internal.preferences.ProjectDependentPreferencesPage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class RepositoriesPreferencePage extends ProjectDependentPreferencesPage implements IWorkbenchPreferencePage
-{
-
-    private boolean changed;
-    private RepositoriesView viewPage;
-
-    public RepositoriesPreferencePage()
-    {
-        super("Repository Preferences");
-    }
-
-    @Override
-    protected Control createContents(Composite parent)
-    {
-        Control control = initContents(parent);
-        return control;
-    }
-
-    @Override
-    protected IPreferenceStore doGetPreferenceStore()
-    {
-        return SigilCore.getDefault().getPreferenceStore();
-    }
-
-    protected void changed()
-    {
-        changed = true;
-        updateApplyButton();
-    }
-
-    private Control initContents(Composite parent)
-    {
-        viewPage = new RepositoriesView(this);
-
-        Composite control = new Composite(parent, SWT.NONE);
-
-        TabFolder folder = new TabFolder(control, SWT.TOP);
-
-        TabItem view = new TabItem(folder, SWT.NONE);
-        view.setText("Repositories");
-        view.setControl(viewPage.createContents(folder));
-
-        control.setLayout(new GridLayout(1, true));
-        folder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-        return control;
-    }
-
-    public void init(IWorkbench workbench)
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    protected void doSave()
-    {
-        try
-        {
-            IRepositoryPreferences config = SigilCore.getRepositoryPreferences();
-            config.saveRepositories(viewPage.getRepositories());
-
-            setErrorMessage(null);
-            getApplyButton().setEnabled(false);
-            changed = false;
-        }
-        catch (CoreException e)
-        {
-            setErrorMessage("Failed to save repositories:" + e.getStatus().getMessage());
-            SigilCore.error("Failed to save repositories", e);
-        }
-    }
-
-    @Override
-    protected boolean isDirty()
-    {
-        return changed;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesView.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesView.java
deleted file mode 100644
index a2db4df..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesView.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.ui.actions.RefreshRepositoryAction;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizard;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-
-public class RepositoriesView
-{
-    private final RepositoriesPreferencePage page;
-
-    private List<IRepositoryModel> repositories;
-
-    private TableViewer repositoryView;
-
-    public RepositoriesView(RepositoriesPreferencePage page)
-    {
-        this.page = page;
-    }
-
-    public Control createContents(Composite parent)
-    {
-        // Create Controls
-        Composite composite = new Composite(parent, SWT.NONE);
-
-        Table table = new Table(composite, SWT.MULTI | SWT.BORDER);
-
-        // Table Viewer Setup
-        repositoryView = new TableViewer(table);
-        repositoryView.setLabelProvider(new LabelProvider()
-        {
-            @Override
-            public String getText(Object element)
-            {
-                IRepositoryModel rep = (IRepositoryModel) element;
-                return rep.getName();
-            }
-
-            @Override
-            public Image getImage(Object element)
-            {
-                IRepositoryModel rep = (IRepositoryModel) element;
-                return rep.getType().getIcon();
-            }
-        });
-
-        repositoryView.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return toArray(inputElement);
-            }
-        });
-
-        // Layout
-        composite.setLayout(new GridLayout(2, false));
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 7));
-
-        createButtons(composite, repositoryView);
-
-        repositories = SigilCore.getRepositoryPreferences().loadRepositories();
-        repositoryView.setInput(repositories);
-
-        return composite;
-    }
-
-    private void createButtons(final Composite composite, final TableViewer repositoryView)
-    {
-        final Button add = new Button(composite, SWT.PUSH);
-        add.setText("Add...");
-        add.setEnabled(true);
-
-        final Button upBtn = new Button(composite, SWT.PUSH);
-        upBtn.setText("Up");
-        upBtn.setEnabled(false);
-
-        final Button downBtn = new Button(composite, SWT.PUSH);
-        downBtn.setText("Down");
-        downBtn.setEnabled(false);
-        
-        final Button edit = new Button(composite, SWT.PUSH);
-        edit.setText("Edit...");
-        edit.setEnabled(false);
-        
-        final Button remove = new Button(composite, SWT.PUSH);
-        remove.setText("Remove");
-        remove.setEnabled(false);
-
-        final Button refresh = new Button(composite, SWT.PUSH);
-        refresh.setText("Refresh");
-        refresh.setEnabled(false);
-                
-        // Listeners
-        add.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                add(composite);
-            }
-        });
-
-        edit.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection sel = (IStructuredSelection) repositoryView.getSelection();
-                edit(composite, sel);
-            }
-        });
-
-        remove.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection sel = (IStructuredSelection) repositoryView.getSelection();
-                remove(sel);
-            }
-        });
-
-        refresh.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection sel = (IStructuredSelection) repositoryView.getSelection();
-                refresh(composite, sel);
-            }
-        });
-
-        upBtn.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                up();
-            }
-        });
-        
-        downBtn.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                down();
-            }
-        });
-        
-        repositoryView.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                boolean selected = !event.getSelection().isEmpty();
-                if (selected)
-                {
-                    refresh.setEnabled(true);
-
-                    IStructuredSelection sel = (IStructuredSelection) event.getSelection();
-
-                    checkEditEnabled(edit, sel);
-                    checkRemoveEnabled(remove, sel);
-                    upBtn.setEnabled(sel.size() == 1);
-                    downBtn.setEnabled(sel.size() == 1);
-                }
-                else
-                {
-                    upBtn.setEnabled(false);
-                    downBtn.setEnabled(false);
-                    refresh.setEnabled(false);
-                    edit.setEnabled(false);
-                    remove.setEnabled(false);
-                }
-            }
-        });
-
-        // layout
-        add.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-        upBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-        downBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-        edit.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-        remove.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-    }
-    
-    private void up()
-    {
-        IRepositoryModel model = (IRepositoryModel) ((StructuredSelection) repositoryView.getSelection()).getFirstElement();
-        int i = repositories.indexOf(model);
-        if (i > 0)
-        {
-            repositories.remove(i);
-            repositories.add(i - 1, model);
-            repositoryView.refresh();
-        }
-    }
-
-    private void down()
-    {
-        IRepositoryModel model = (IRepositoryModel) ((StructuredSelection) repositoryView.getSelection()).getFirstElement();
-        int i = repositories.indexOf(model);
-        if (i < repositories.size() - 1)
-        {
-            repositories.remove(i);
-            repositories.add(i + 1, model);
-            repositoryView.refresh();
-        }
-    }    
-
-    @SuppressWarnings("unchecked")
-    private void checkRemoveEnabled(Button button, IStructuredSelection sel)
-    {
-        boolean alldynamic = true;
-        for (Iterator i = sel.iterator(); i.hasNext();)
-        {
-            IRepositoryModel model = (IRepositoryModel) i.next();
-            if (!model.getType().isDynamic())
-            {
-                alldynamic = false;
-                break;
-            }
-        }
-        button.setEnabled(alldynamic);
-    }
-
-    private void checkEditEnabled(Button edit, IStructuredSelection sel)
-    {
-        if (sel.size() == 1)
-        {
-            IRepositoryModel element = (IRepositoryModel) sel.getFirstElement();
-            if (WizardHelper.hasWizard(element.getType()))
-            {
-                edit.setEnabled(true);
-            }
-            else
-            {
-                edit.setEnabled(false);
-            }
-        }
-        else
-        {
-            edit.setEnabled(false);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private void refresh(Control parent, IStructuredSelection sel)
-    {
-        ArrayList<IRepositoryModel> models = new ArrayList<IRepositoryModel>(sel.size());
-
-        for (Iterator i = sel.iterator(); i.hasNext();)
-        {
-            IRepositoryModel model = (IRepositoryModel) i.next();
-            models.add(model);
-        }
-
-        new RefreshRepositoryAction(models.toArray(new IRepositoryModel[models.size()])).run();
-    }
-
-    private void add(Control parent)
-    {
-        NewRepositoryWizard wizard = new NewRepositoryWizard();
-        WizardDialog dialog = new WizardDialog(getShell(parent), wizard);
-        if (dialog.open() == Window.OK)
-        {
-            repositories.add(wizard.getRepository());
-            updated();
-        }
-    }
-
-    private void edit(Control parent, IStructuredSelection sel)
-    {
-        IRepositoryModel model = (IRepositoryModel) sel.getFirstElement();
-        try
-        {
-            RepositoryWizard wizard = WizardHelper.loadWizard(model.getType());
-            wizard.init(model);
-            WizardDialog dialog = new WizardDialog(getShell(parent), wizard);
-            if (dialog.open() == Window.OK)
-            {
-                updated();
-            }
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to load wizard", e);
-            MessageDialog.openError(getShell(parent), "Error", "Failed to load wizard:"
-                + e.getStatus().getMessage());
-        }
-    }
-
-    private Shell getShell(Control parent)
-    {
-        return parent.getShell();
-    }
-
-    @SuppressWarnings("unchecked")
-    private void remove(IStructuredSelection sel)
-    {
-        boolean change = false;
-        for (Iterator i = sel.iterator(); i.hasNext();)
-        {
-            change = repositories.remove(i.next());
-        }
-
-        if (change)
-        {
-            updated();
-        }
-    }
-
-    private void updated()
-    {
-        repositoryView.refresh();
-        page.changed();
-    }
-
-    public List<IRepositoryModel> getRepositories()
-    {
-        return repositories;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryTypeSelectionPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryTypeSelectionPage.java
deleted file mode 100644
index 74e856a..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryTypeSelectionPage.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardSelectionPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-
-public class RepositoryTypeSelectionPage extends WizardSelectionPage implements IWizardPage
-{
-
-    private static final String TITLE = "Select Repository";
-
-    private TableViewer repositoryView;
-    private IRepositoryModel repositoryElement;
-
-    public RepositoryTypeSelectionPage()
-    {
-        super(TITLE);
-        setTitle(TITLE);
-    }
-
-    public void createControl(Composite parent)
-    {
-        Composite control = new Composite(parent, SWT.NONE);
-
-        // components
-        new Label(control, SWT.NONE).setText("Repositories");
-        Table table = new Table(control, SWT.SINGLE | SWT.BORDER);
-
-        // layout
-        control.setLayout(new GridLayout(1, true));
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-        // view
-        repositoryView = new TableViewer(table);
-        repositoryView.setLabelProvider(new LabelProvider()
-        {
-            @Override
-            public String getText(Object element)
-            {
-                IRepositoryType rep = (IRepositoryType) element;
-                return rep.getName();
-            }
-
-            @Override
-            public Image getImage(Object element)
-            {
-                IRepositoryType rep = (IRepositoryType) element;
-                return rep.getIcon();
-            }
-        });
-
-        repositoryView.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return toArray(inputElement);
-            }
-        });
-
-        repositoryView.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                if (!event.getSelection().isEmpty())
-                {
-                    IStructuredSelection sel = (IStructuredSelection) event.getSelection();
-                    IRepositoryType type = (IRepositoryType) sel.getFirstElement();
-                    repositoryElement = SigilCore.getRepositoryPreferences().newRepositoryElement(
-                        type);
-                    selectWizardNode(new RepositoryWizardNode(repositoryElement));
-                }
-            }
-        });
-
-        ArrayList<IRepositoryType> descriptors = new ArrayList<IRepositoryType>(
-            SigilCore.getRepositoryPreferences().loadRepositoryTypes());
-
-        for (Iterator<IRepositoryType> i = descriptors.iterator(); i.hasNext();)
-        {
-            if (!i.next().isDynamic())
-            {
-                i.remove();
-            }
-        }
-
-        repositoryView.setInput(descriptors);
-
-        setControl(control);
-    }
-
-    public void selectWizardNode(RepositoryWizardNode node)
-    {
-        setSelectedNode(node);
-    }
-
-    public RepositoryWizardNode getSelectedWizardNode()
-    {
-        return (RepositoryWizardNode) getSelectedNode();
-    }
-
-    public IRepositoryModel getRepository()
-    {
-        return repositoryElement;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryViewData.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryViewData.java
deleted file mode 100644
index 714bb12..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryViewData.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;
-
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-
-class RepositoryViewData
-{
-    private String name;
-    private IRepositoryModel[] reps;
-
-    RepositoryViewData(String name, IRepositoryModel[] reps)
-    {
-        this.name = name;
-        this.reps = reps;
-    }
-
-    String getName()
-    {
-        return name;
-    }
-
-    IRepositoryModel[] getRepositories()
-    {
-        return reps;
-    }
-
-    void setName(String name)
-    {
-        this.name = name;
-    }
-
-    void setRepositories(IRepositoryModel[] reps)
-    {
-        this.reps = reps;
-    }
-
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryWizardNode.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryWizardNode.java
deleted file mode 100644
index 6a4a7d6..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryWizardNode.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizard;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardNode;
-import org.eclipse.swt.graphics.Point;
-
-public class RepositoryWizardNode implements IWizardNode
-{
-
-    private IRepositoryModel repository;
-
-    private RepositoryWizard wizard;
-
-    public RepositoryWizardNode(IRepositoryModel repository)
-    {
-        this.repository = repository;
-    }
-
-    public void dispose()
-    {
-        if (wizard != null)
-        {
-            wizard.dispose();
-            wizard = null;
-        }
-    }
-
-    public Point getExtent()
-    {
-        return new Point(-1, -1);
-    }
-
-    public IWizard getWizard()
-    {
-        if (wizard == null)
-        {
-            try
-            {
-                wizard = WizardHelper.loadWizard(repository.getType());
-                wizard.init(repository);
-            }
-            catch (CoreException e)
-            {
-                SigilCore.error("Failed to create wizard for " + repository.getType(), e);
-            }
-        }
-        return wizard;
-    }
-
-    public IRepositoryModel getRepository()
-    {
-        return repository;
-    }
-
-    public boolean isContentCreated()
-    {
-        return wizard != null;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/WizardHelper.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/WizardHelper.java
deleted file mode 100644
index 43709bb..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/WizardHelper.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizard;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-
-public class WizardHelper
-{
-    public static RepositoryWizard loadWizard(IRepositoryType type) throws CoreException
-    {
-        IConfigurationElement e = findWizardConfig(type.getId());
-
-        if (e == null)
-        {
-            throw SigilCore.newCoreException("No wizard registered for repository "
-                + type, null);
-        }
-
-        return (RepositoryWizard) e.createExecutableExtension("class");
-    }
-
-    public static boolean hasWizard(IRepositoryType type)
-    {
-        return findWizardConfig(type.getId()) != null;
-    }
-
-    private static IConfigurationElement findWizardConfig(String id)
-    {
-        IExtensionRegistry registry = Platform.getExtensionRegistry();
-        IExtensionPoint p = registry.getExtensionPoint(SigilUI.REPOSITORY_WIZARD_EXTENSION_POINT_ID);
-
-        for (IExtension e : p.getExtensions())
-        {
-            for (IConfigurationElement c : e.getConfigurationElements())
-            {
-                if (id.equals(c.getAttribute("repository")))
-                {
-                    return c;
-                }
-            }
-        }
-
-        return null;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportPackageProposal.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportPackageProposal.java
deleted file mode 100644
index a9b8d3a..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportPackageProposal.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.sigil.eclipse.ui.internal.quickfix;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.ModelElementFactoryException;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.ModelHelper;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-public class ImportPackageProposal implements IJavaCompletionProposal
-{
-
-    private IPackageExport e;
-    private ISigilProjectModel n;
-
-    public ImportPackageProposal(IPackageExport e, ISigilProjectModel n)
-    {
-        this.e = e;
-        this.n = n;
-    }
-
-    public int getRelevance()
-    {
-        return 100;
-    }
-
-    public void apply(IDocument document)
-    {
-        try
-        {
-
-            final IPackageImport i = ModelElementFactory.getInstance().newModelElement(
-                IPackageImport.class);
-            i.setPackageName(e.getPackageName());
-            VersionRange selectedVersions = ModelHelper.getDefaultRange(e.getVersion());
-            i.setVersions(selectedVersions);
-
-            WorkspaceModifyOperation op = new WorkspaceModifyOperation()
-            {
-                @Override
-                protected void execute(IProgressMonitor monitor) throws CoreException
-                {
-                    n.getBundle().getBundleInfo().addImport(i);
-                    n.save(monitor);
-                }
-            };
-
-            SigilUI.runWorkspaceOperation(op, null);
-        }
-        catch (ModelElementFactoryException e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    public String getAdditionalProposalInfo()
-    {
-        return null;
-    }
-
-    public IContextInformation getContextInformation()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public String getDisplayString()
-    {
-        return "Import package " + e.getPackageName() + " version " + e.getVersion()
-            + " to bundle";
-    }
-
-    public Image getImage()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Point getSelection(IDocument document)
-    {
-        return null;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportQuickFixProcessor.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportQuickFixProcessor.java
deleted file mode 100644
index dee8516..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportQuickFixProcessor.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.quickfix;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.search.ISearchResult;
-import org.apache.felix.sigil.search.SigilSearch;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.ArrayType;
-import org.eclipse.jdt.core.dom.ClassInstanceCreation;
-import org.eclipse.jdt.core.dom.ImportDeclaration;
-import org.eclipse.jdt.core.dom.MethodInvocation;
-import org.eclipse.jdt.core.dom.Name;
-import org.eclipse.jdt.core.dom.QualifiedName;
-import org.eclipse.jdt.core.dom.SimpleType;
-import org.eclipse.jdt.core.dom.Type;
-import org.eclipse.jdt.internal.corext.dom.ASTNodes;
-import org.eclipse.jdt.ui.text.java.IInvocationContext;
-import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
-import org.eclipse.jdt.ui.text.java.IProblemLocation;
-import org.eclipse.jdt.ui.text.java.IQuickFixProcessor;
-
-public class ImportQuickFixProcessor implements IQuickFixProcessor
-{
-
-    private static final Object SYNC_FLAG = new Object();
-
-    public boolean hasCorrections(ICompilationUnit unit, int problemId)
-    {
-        switch (problemId)
-        {
-            case IProblem.ForbiddenReference:
-            case IProblem.ImportNotFound:
-            case IProblem.IsClassPathCorrect:
-            case IProblem.UndefinedType:
-            case IProblem.UndefinedName:
-                return true;
-            default:
-                return false;
-        }
-    }
-
-    public IJavaCompletionProposal[] getCorrections(IInvocationContext context,
-        IProblemLocation[] locations) throws CoreException
-    {
-        try
-        {
-            HashMap<Object, IJavaCompletionProposal> results = new HashMap<Object, IJavaCompletionProposal>();
-
-            ISigilProjectModel project = findProject(context);
-
-            if (project != null)
-            {
-                for (int i = 0; i < locations.length; i++)
-                {
-                    switch (locations[i].getProblemId())
-                    {
-                        case IProblem.ForbiddenReference:
-                            handleImportNotFound(project, context, locations[i], results);
-                            break;
-                        case IProblem.ImportNotFound:
-                            handleImportNotFound(project, context, locations[i], results);
-                            break;
-                        case IProblem.IsClassPathCorrect:
-                            handleIsClassPathCorrect(project, context, locations[i],
-                                results);
-                            break;
-                        case IProblem.UndefinedType:
-                            handleUndefinedType(project, context, locations[i], results);
-                            break;
-                        case IProblem.UndefinedName:
-                            handleUndefinedName(project, context, locations[i], results);
-                            break;
-                    }
-                }
-            }
-
-            return (IJavaCompletionProposal[]) results.values().toArray(
-                new IJavaCompletionProposal[results.size()]);
-        }
-        catch (RuntimeException e)
-        {
-            e.printStackTrace();
-            throw e;
-        }
-    }
-
-    private void handleUndefinedName(ISigilProjectModel project,
-        IInvocationContext context, IProblemLocation problem,
-        HashMap<Object, IJavaCompletionProposal> results)
-    {
-        Name node = findNode(context, problem);
-
-        if (node == null)
-        {
-            return;
-        }
-        addSearchResults(node, project, results);
-    }
-
-    private void handleIsClassPathCorrect(ISigilProjectModel project,
-        final IInvocationContext context, IProblemLocation problemLocation,
-        final HashMap<Object, IJavaCompletionProposal> results)
-    {
-        for (final String type : problemLocation.getProblemArguments())
-        {
-            final String iPackage = type.substring(0, type.lastIndexOf("."));
-
-            for (IPackageExport pe : JavaHelper.findExportsForPackage(project, iPackage))
-            {
-                results.put(type, new ImportPackageProposal(pe, project));
-            }
-        }
-
-        if (!results.containsKey(SYNC_FLAG))
-        {
-            //results.put( SYNC_FLAG, null);
-        }
-    }
-
-    private void handleUndefinedType(ISigilProjectModel project,
-        IInvocationContext context, IProblemLocation problem,
-        HashMap<Object, IJavaCompletionProposal> results) throws CoreException
-    {
-        Name node = findNode(context, problem);
-
-        if (node == null)
-        {
-            return;
-        }
-        addSearchResults(node, project, results);
-    }
-
-    private void handleImportNotFound(ISigilProjectModel project,
-        final IInvocationContext context, IProblemLocation location,
-        final HashMap<Object, IJavaCompletionProposal> results) throws CoreException
-    {
-        ASTNode selectedNode = location.getCoveringNode(context.getASTRoot());
-        if (selectedNode == null)
-            return;
-
-        // check QualifiedName for search results as well - 
-        // happens if import package is already added but exported package has been removed 
-        if (selectedNode instanceof ClassInstanceCreation)
-        {
-            ClassInstanceCreation c = (ClassInstanceCreation) selectedNode;
-            Type t = c.getType();
-            Name node = findName(t);
-            if (node != null)
-            {
-                addSearchResults(node, project, results);
-            }
-        }
-        else
-        {
-            for (final String iPackage : readPackage(selectedNode, location))
-            {
-                if (!results.containsKey(iPackage))
-                {
-                    for (IPackageExport pe : JavaHelper.findExportsForPackage(project,
-                        iPackage))
-                    {
-                        results.put(iPackage, new ImportPackageProposal(pe, project));
-                    }
-                }
-            }
-        }
-    }
-
-    private void addSearchResults(Name node, ISigilProjectModel project,
-        HashMap<Object, IJavaCompletionProposal> results)
-    {
-        for (ISearchResult result : SigilSearch.findProviders(
-            node.getFullyQualifiedName(), project, null))
-        {
-            if (project.getBundle().findImport(result.getPackageName()) == null)
-            {
-                String type = result.getPackageName() + "."
-                    + node.getFullyQualifiedName();
-                results.put(type, new ImportSearchResultProposal(
-                    SigilUI.getActiveWorkbenchShell(), result, node, project));
-            }
-        }
-    }
-
-    private Name findName(Type t)
-    {
-        if (t.isSimpleType())
-        {
-            SimpleType st = (SimpleType) t;
-            return st.getName();
-        }
-        else if (t.isArrayType())
-        {
-            ArrayType at = (ArrayType) t;
-            return findName(at.getElementType());
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    private Name findNode(IInvocationContext context, IProblemLocation problem)
-    {
-        ASTNode selectedNode = problem.getCoveringNode(context.getASTRoot());
-        if (selectedNode == null)
-        {
-            return null;
-        }
-
-        while (selectedNode.getLocationInParent() == QualifiedName.NAME_PROPERTY)
-        {
-            selectedNode = selectedNode.getParent();
-        }
-
-        Name node = null;
-
-        if (selectedNode instanceof Type)
-        {
-            node = findName((Type) selectedNode);
-        }
-        else if (selectedNode instanceof Name)
-        {
-            node = (Name) selectedNode;
-        }
-
-        return node;
-    }
-
-    private ISigilProjectModel findProject(IInvocationContext context)
-        throws CoreException
-    {
-        IProject project = context.getCompilationUnit().getJavaProject().getProject();
-        if (project.hasNature(SigilCore.NATURE_ID))
-        {
-            return SigilCore.create(project);
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    private String[] readPackage(ASTNode selectedNode, IProblemLocation location)
-    {
-        ArrayList<String> packages = new ArrayList<String>();
-
-        ImportDeclaration id = (ImportDeclaration) ASTNodes.getParent(selectedNode,
-            ASTNode.IMPORT_DECLARATION);
-
-        if (id == null)
-        {
-            MethodInvocation m = (MethodInvocation) ASTNodes.getParent(selectedNode,
-                ASTNode.METHOD_INVOCATION);
-
-            if (m != null)
-            {
-                packages.add(readPackage(m));
-                while (m.getExpression() != null
-                    && m.getExpression() instanceof MethodInvocation)
-                {
-                    m = (MethodInvocation) m.getExpression();
-                    packages.add(readPackage(m));
-                }
-            }
-        }
-        else
-        {
-            if (id.isOnDemand())
-            {
-                packages.add(id.getName().toString());
-            }
-            else
-            {
-                String iStr = id.getName().toString();
-                packages.add(iStr.substring(0, iStr.lastIndexOf(".")));
-            }
-        }
-
-        return packages.toArray(new String[packages.size()]);
-    }
-
-    private String readPackage(MethodInvocation m)
-    {
-        return m.resolveMethodBinding().getDeclaringClass().getPackage().getName();
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportSearchResultProposal.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportSearchResultProposal.java
deleted file mode 100644
index 8770cd2..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportSearchResultProposal.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.quickfix;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.ModelHelper;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.search.ISearchResult;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.Name;
-import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
-import org.eclipse.jdt.internal.corext.dom.ASTNodes;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-import org.eclipse.jdt.ui.CodeStyleConfiguration;
-import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-public class ImportSearchResultProposal implements IJavaCompletionProposal
-{
-
-    private ISigilProjectModel project;
-    private ICompilationUnit fCompilationUnit;
-    private final ISearchResult result;
-    private final Shell shell;
-
-    public ImportSearchResultProposal(Shell shell, ISearchResult result, Name node, ISigilProjectModel project)
-    {
-        this.shell = shell;
-        this.result = result;
-        this.project = project;
-        if (node != null)
-        {
-            CompilationUnit cu = (CompilationUnit) ASTNodes.getParent(node,
-                ASTNode.COMPILATION_UNIT);
-            this.fCompilationUnit = (ICompilationUnit) cu.getJavaElement();
-        }
-    }
-
-    public int getRelevance()
-    {
-        return 100;
-    }
-
-    public void apply(IDocument document)
-    {
-        IPackageExport e = result.getExport();
-        if (result.getExport() == null)
-        {
-            if (MessageDialog.openQuestion(shell, "Modify "
-                + result.getProvider().getBundleInfo().getSymbolicName(),
-                result.getPackageName()
-                    + " is not exported. Do you want to export it now?"))
-            {
-                final IPackageExport pe = ModelElementFactory.getInstance().newModelElement(
-                    IPackageExport.class);
-                pe.setPackageName(result.getPackageName());
-                //e.setVersion(version)
-                final ISigilProjectModel mod = result.getProvider().getAncestor(
-                    ISigilProjectModel.class);
-                if (mod == null)
-                {
-                    throw new IllegalStateException(
-                        "Attempt to modify binary package export");
-                }
-                WorkspaceModifyOperation op = new WorkspaceModifyOperation()
-                {
-                    @Override
-                    protected void execute(IProgressMonitor monitor) throws CoreException
-                    {
-                        mod.getBundle().getBundleInfo().addExport(pe);
-                        mod.save(monitor);
-                    }
-                };
-
-                SigilUI.runWorkspaceOperation(op, null);
-                e = pe;
-            }
-        }
-
-        final IPackageImport i = ModelElementFactory.getInstance().newModelElement(
-            IPackageImport.class);
-        i.setPackageName(e.getPackageName());
-        VersionRange selectedVersions = ModelHelper.getDefaultRange(e.getVersion());
-        i.setVersions(selectedVersions);
-
-        WorkspaceModifyOperation op = new WorkspaceModifyOperation()
-        {
-            @Override
-            protected void execute(IProgressMonitor monitor) throws CoreException
-            {
-                project.getBundle().getBundleInfo().addImport(i);
-                project.save(null);
-            }
-        };
-
-        SigilUI.runWorkspaceOperation(op, null);
-        addSourceImport();
-    }
-
-    private void addSourceImport()
-    {
-        // add import
-        try
-        {
-            ImportRewrite rewrite = CodeStyleConfiguration.createImportRewrite(
-                fCompilationUnit, true);
-            rewrite.addImport(result.getClassName());
-            JavaModelUtil.applyEdit(fCompilationUnit, rewrite.rewriteImports(null),
-                false, null);
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to add import", e);
-        }
-    }
-
-    public String getAdditionalProposalInfo()
-    {
-        return null;
-    }
-
-    public IContextInformation getContextInformation()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public String getDisplayString()
-    {
-        String type = result.getClassName();
-        String loc = result.getExport() == null ? " from "
-            + result.getProvider().getBundleInfo().getSymbolicName() : " version "
-            + result.getExport().getVersion();
-        return "Import " + type + loc;
-    }
-
-    public Image getImage()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Point getSelection(IDocument document)
-    {
-        return null;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportedClassReference.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportedClassReference.java
deleted file mode 100644
index b5c787d..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/quickfix/ImportedClassReference.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.quickfix;
-
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-
-public class ImportedClassReference
-{
-    private IPackageImport pi;
-    private String type;
-
-    public ImportedClassReference(IPackageImport packageImport, String typeName)
-    {
-        this.pi = packageImport;
-        this.type = typeName;
-    }
-
-    public IPackageImport getPackageImport()
-    {
-        return pi;
-    }
-
-    public String getFullType()
-    {
-        return type;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/BundleActivatorChange.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/BundleActivatorChange.java
deleted file mode 100644
index 773264c..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/BundleActivatorChange.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-
-/**
- * @author dave
- *
- */
-public class BundleActivatorChange extends Change
-{
-
-    private final ISigilProjectModel sigil;
-    private final String oldName;
-    private final String newName;
-
-    /**
-     * @param sigil
-     * @param oldName
-     * @param newName
-     */
-    public BundleActivatorChange(ISigilProjectModel sigil, String oldName, String newName)
-    {
-        this.sigil = sigil;
-        this.oldName = oldName;
-        this.newName = newName;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ltk.core.refactoring.Change#getModifiedElement()
-     */
-    @Override
-    public Object getModifiedElement()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ltk.core.refactoring.Change#getName()
-     */
-    @Override
-    public String getName()
-    {
-        return "Bundle Activator Rename";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ltk.core.refactoring.Change#initializeValidationData(org.eclipse.core.runtime.IProgressMonitor)
-     */
-    @Override
-    public void initializeValidationData(IProgressMonitor monitor)
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ltk.core.refactoring.Change#isValid(org.eclipse.core.runtime.IProgressMonitor)
-     */
-    @Override
-    public RefactoringStatus isValid(IProgressMonitor monitor) throws CoreException,
-        OperationCanceledException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ltk.core.refactoring.Change#perform(org.eclipse.core.runtime.IProgressMonitor)
-     */
-    @Override
-    public Change perform(IProgressMonitor monitor) throws CoreException
-    {
-        sigil.getBundle().getBundleInfo().setActivator(newName);
-        sigil.save(monitor);
-        return new BundleActivatorChange(sigil, newName, oldName);
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/ExportChangePreviewViewer.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/ExportChangePreviewViewer.java
deleted file mode 100644
index 30554c2..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/ExportChangePreviewViewer.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.eclipse.ltk.ui.refactoring.ChangePreviewViewerInput;
-import org.eclipse.ltk.ui.refactoring.IChangePreviewViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ViewForm;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * @author dave
- *
- */
-public class ExportChangePreviewViewer implements IChangePreviewViewer
-{
-
-    private ViewForm control;
-    private Label text;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ltk.ui.refactoring.IChangePreviewViewer#createControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createControl(Composite parent)
-    {
-        control = new ViewForm(parent, SWT.NONE);
-        text = new Label(control, SWT.NONE);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ltk.ui.refactoring.IChangePreviewViewer#getControl()
-     */
-    public Control getControl()
-    {
-        return control;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ltk.ui.refactoring.IChangePreviewViewer#setInput(org.eclipse.ltk.ui.refactoring.ChangePreviewViewerInput)
-     */
-    public void setInput(ChangePreviewViewerInput input)
-    {
-        ExportPackageChange change = (ExportPackageChange) input.getChange();
-        StringBuilder buf = new StringBuilder();
-        buf.append("Export-Package: \n");
-        if ( change.getOldExport() != null ) {
-            buf.append("- ");
-            appendPackage(change.getOldExport(), buf);
-            buf.append("\n");
-        }
-        
-        if ( change.getNewExport() != null ) {
-            buf.append("+ ");
-            appendPackage(change.getNewExport(), buf);
-            buf.append("\n");
-        }
-        text.setText(buf.toString());
-    }
-
-    /**
-     * @param pe
-     * @param buf
-     */
-    private void appendPackage(IPackageExport pe, StringBuilder buf)
-    {
-        buf.append(pe.getPackageName());
-        if (pe.getVersion() != null) {
-            buf.append(";version=");
-            buf.append(pe.getVersion());
-        }
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/ExportPackageChange.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/ExportPackageChange.java
deleted file mode 100644
index eaf0bdf..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/ExportPackageChange.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-
-public class ExportPackageChange extends Change
-{
-
-    private final ISigilProjectModel sigil;
-    private final IPackageExport oldExport;
-    private final IPackageExport newExport;
-
-    public ExportPackageChange(ISigilProjectModel sigil, IPackageExport oldExport, IPackageExport newExport)
-    {
-        this.sigil = sigil;
-        this.oldExport = oldExport;
-        this.newExport = newExport;
-    }
-
-    @Override
-    public Object getModifiedElement()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getName()
-    {
-        return "Export package update";
-    }
-
-    @Override
-    public void initializeValidationData(IProgressMonitor progress)
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public RefactoringStatus isValid(IProgressMonitor progress) throws CoreException,
-        OperationCanceledException
-    {
-        // TODO check project is synchronized
-        return new RefactoringStatus();
-    }
-
-    @Override
-    public Change perform(IProgressMonitor progress) throws CoreException
-    {
-        if (oldExport != null)
-        {
-            sigil.getBundle().getBundleInfo().removeExport(oldExport);
-        }
-
-        if (newExport != null)
-        {
-            sigil.getBundle().getBundleInfo().addExport(newExport);
-        }
-
-        sigil.save(progress);
-
-        return new ExportPackageChange(sigil, newExport, oldExport);
-    }
-
-    /**
-     * @return
-     */
-    public IPackageExport getOldExport()
-    {
-        return oldExport;
-    }
-
-    /**
-     * @return
-     */
-    public IPackageExport getNewExport()
-    {
-        return newExport;
-    }
-    
-    public ISigilProjectModel getProject() {
-        return sigil;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/ImportPackageChange.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/ImportPackageChange.java
deleted file mode 100644
index cf3b990..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/ImportPackageChange.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-
-public class ImportPackageChange extends Change
-{
-
-    private final ISigilProjectModel sigil;
-    private final IPackageImport oldImport;
-    private final IPackageImport newImport;
-
-    public ImportPackageChange(ISigilProjectModel sigil, IPackageImport oldImport, IPackageImport newImport)
-    {
-        this.sigil = sigil;
-        this.oldImport = oldImport;
-        this.newImport = newImport;
-    }
-
-    @Override
-    public Object getModifiedElement()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getName()
-    {
-        return "Import package update";
-    }
-
-    @Override
-    public void initializeValidationData(IProgressMonitor arg0)
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public RefactoringStatus isValid(IProgressMonitor progress) throws CoreException,
-        OperationCanceledException
-    {
-        // TODO check project is synchronized
-        return new RefactoringStatus();
-    }
-
-    @Override
-    public Change perform(IProgressMonitor progress) throws CoreException
-    {
-        if (oldImport != null)
-        {
-            sigil.getBundle().getBundleInfo().removeImport(oldImport);
-        }
-
-        if (newImport != null)
-        {
-            sigil.getBundle().getBundleInfo().addImport(newImport);
-        }
-
-        sigil.save(progress);
-
-        return new ImportPackageChange(sigil, newImport, oldImport);
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/MoveActivatorParticipant.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/MoveActivatorParticipant.java
deleted file mode 100644
index f45a4e9..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/MoveActivatorParticipant.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.NullChange;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.MoveParticipant;
-
-public class MoveActivatorParticipant extends MoveParticipant
-{
-    private ICompilationUnit compilationUnit;
-    private List<Change> changes = new LinkedList<Change>();
-
-    @Override
-    public RefactoringStatus checkConditions(IProgressMonitor monitor,
-        CheckConditionsContext ctx) throws OperationCanceledException
-    {
-        RefactoringStatus status = null;
-        if (getArguments().getUpdateReferences())
-        {
-            IPackageFragment pf = (IPackageFragment) compilationUnit.getAncestor(IJavaModel.PACKAGE_FRAGMENT);
-            String oldName = qualifiedName(pf, compilationUnit.getElementName());
-            try
-            {
-                ISigilProjectModel sigil = SigilCore.create(compilationUnit.getJavaProject().getProject());
-                if (oldName.equals(sigil.getBundle().getBundleInfo().getActivator()))
-                {
-                    IPackageFragment dest = (IPackageFragment) getArguments().getDestination();
-                    String newName = qualifiedName(dest, compilationUnit.getElementName());
-
-                    RefactorUtil.touch(ctx, sigil);
-                    changes.add(new BundleActivatorChange(sigil, oldName, newName));
-                    status = RefactoringStatus.createInfoStatus("Updating bundle activator from "
-                        + oldName + " to " + newName);
-                }
-            }
-            catch (CoreException e)
-            {
-                SigilCore.warn("Failed to update activator", e);
-            }
-        }
-
-        return status;
-    }
-
-    /**
-     * @param pf 
-     * @param compilationUnit2
-     * @return
-     */
-    private static String qualifiedName(IPackageFragment pf, String name)
-    {
-        name = name.substring(0, name.lastIndexOf('.'));
-        return "".equals(pf.getElementName()) ? name : pf.getElementName() + '.' + name;
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor monitor) throws CoreException,
-        OperationCanceledException
-    {
-        if (changes.isEmpty())
-        {
-            return new NullChange();
-        }
-        else
-        {
-            CompositeChange ret = new CompositeChange("Export-Package update");
-
-            ret.addAll(changes.toArray(new Change[changes.size()]));
-
-            return ret;
-        }
-    }
-
-    @Override
-    public String getName()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    protected boolean initialize(Object element)
-    {
-        compilationUnit = (ICompilationUnit) element;
-        return true;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/MoveExportedClassParticipant.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/MoveExportedClassParticipant.java
deleted file mode 100644
index 262fe95..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/MoveExportedClassParticipant.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.ModelHelper;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.NullChange;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.MoveParticipant;
-
-public class MoveExportedClassParticipant extends MoveParticipant
-{
-    private ICompilationUnit compilationUnit;
-    private List<Change> changes = new LinkedList<Change>();
-
-    @Override
-    public RefactoringStatus checkConditions(IProgressMonitor monitor,
-        CheckConditionsContext ctx) throws OperationCanceledException
-    {
-        RefactoringStatus status = null;
-        if (getArguments().getUpdateReferences())
-        {
-            try
-            {
-                ISigilProjectModel sourceProject = SigilCore.create(compilationUnit.getJavaProject().getProject());
-                RefactorUtil.touch(ctx, sourceProject);
-                IPackageFragment packageFragment = (IPackageFragment) compilationUnit.getAncestor(IJavaModel.PACKAGE_FRAGMENT);
-                final String packageName = packageFragment.getElementName();
-                IPackageExport oldExport = ModelHelper.findExport(sourceProject,
-                    packageName);
-
-                if (oldExport != null) {
-                    status = RefactoringStatus.createWarningStatus("Moving a class from an exported package effects client bundles");
-                    
-                    IPackageFragment dest = (IPackageFragment) getArguments().getDestination();
-                    ISigilProjectModel destProject = SigilCore.create(dest.getJavaProject().getProject());
-
-                    if (!destProject.equals(sourceProject)) {
-                        status.addWarning("Moving an exported class to another bundle effects client bundles that use Require-Bundle");
-                    }
-                    
-                    IPackageExport newExport = ModelHelper.findExport(destProject,
-                        dest.getElementName());
-                    
-                    if ( newExport == null ) {
-                        newExport = RefactorUtil.createNewExport(status, changes, destProject, dest.getElementName());
-                    }
-                    
-                    if ( packageFragment.getCompilationUnits().length == 1 ) {
-                        status.addInfo("Last exported class removed from " + packageName);
-                        changes.add( new ExportPackageChange(sourceProject, oldExport, null));
-                    }
-                }
-            }
-            catch (CoreException e)
-            {
-                SigilCore.warn("Failed to update activator", e);
-            }
-        }
-
-        return status;
-    }
-
-    /**
-     * @param pf 
-     * @param compilationUnit2
-     * @return
-     */
-    private static String qualifiedName(IPackageFragment pf, String name)
-    {
-        name = name.substring(0, name.lastIndexOf('.'));
-        return "".equals(pf.getElementName()) ? name : pf.getElementName() + '.' + name;
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor monitor) throws CoreException,
-        OperationCanceledException
-    {
-        if (changes.isEmpty())
-        {
-            return new NullChange();
-        }
-        else
-        {
-            CompositeChange ret = new CompositeChange("Export-Package update");
-
-            ret.addAll(changes.toArray(new Change[changes.size()]));
-
-            return ret;
-        }
-    }
-
-    @Override
-    public String getName()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    protected boolean initialize(Object element)
-    {
-        compilationUnit = (ICompilationUnit) element;
-        return true;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/MovePackageParticipant.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/MovePackageParticipant.java
deleted file mode 100644
index b0addef..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/MovePackageParticipant.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.apache.felix.sigil.eclipse.model.util.ModelHelper;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.NullChange;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.MoveParticipant;
-
-public class MovePackageParticipant extends MoveParticipant
-{
-    private IPackageFragment packageFragment;
-    private List<Change> changes = new LinkedList<Change>();
-
-    @Override
-    public RefactoringStatus checkConditions(IProgressMonitor monitor,
-        CheckConditionsContext context) throws OperationCanceledException
-    {
-        if (getArguments().getUpdateReferences())
-        {
-            try
-            {
-                ISigilProjectModel sourceProject = SigilCore.create(packageFragment.getJavaProject().getProject());
-                IPackageFragmentRoot dest = (IPackageFragmentRoot) getArguments().getDestination();
-                ISigilProjectModel destProject = SigilCore.create(dest.getJavaProject().getProject());
-
-                RefactoringStatus status = new RefactoringStatus();
-                if (!sourceProject.equals(destProject))
-                {
-                    RefactorUtil.touch(context, sourceProject);
-                    RefactorUtil.touch(context, destProject);
-
-                    final String packageName = packageFragment.getElementName();
-                    IPackageExport oldExport = ModelHelper.findExport(sourceProject,
-                        packageName);
-
-                    if (oldExport != null)
-                    {
-                        IPackageExport newExport = ModelElementFactory.getInstance().newModelElement(
-                            IPackageExport.class);
-
-                        newExport.setPackageName(oldExport.getPackageName());
-                        newExport.setVersion(oldExport.getRawVersion());
-
-                        changes.add(new ExportPackageChange(destProject, null, newExport));
-                        changes.add(new ExportPackageChange(sourceProject, oldExport,
-                            null));
-
-                        status.addWarning("Package " + packageName + " is exported from "
-                            + sourceProject.getSymbolicName()
-                            + ", this may effect client bundles that use require bundle");
-                    }
-                    else
-                    {
-                        SubMonitor sub = SubMonitor.convert(monitor);
-                        
-                        sub.beginTask("Resolving package users", 200);
-                        
-                        Set<String> users = JavaHelper.findLocalPackageUsers(
-                            sourceProject, packageName, sub.newChild(100));
-                        Set<String> dependencies = JavaHelper.findLocalPackageDependencies(
-                            sourceProject, packageName, sub.newChild(100));
-
-                        if (users.size() > 0 && dependencies.size() > 0)
-                        {
-                            status.addWarning("Package " + packageName
-                                + " is coupled to " + users + " and " + dependencies
-                                + " this may cause a cyclical dependency");
-                        }
-
-                        if (users.size() > 0)
-                        { // attempt to move an API package
-                            IPackageExport newExport = RefactorUtil.createNewExport(status, changes,
-                                destProject, packageName);
-                            RefactorUtil.createNewImport(status, changes, sourceProject, newExport);
-                        }
-
-                        if (dependencies.size() > 0)
-                        { // moved an impl package
-                            for (String dep : dependencies)
-                            {
-                                IPackageExport newExport = RefactorUtil.createNewExport(status, changes,
-                                    sourceProject, dep);
-                                RefactorUtil.createNewImport(status, changes, destProject, newExport);
-                            }
-                        }
-                    }
-                }
-                return status;
-            }
-            catch (CoreException e)
-            {
-                SigilCore.warn("Failed to create move refactor conditions", e);
-                throw new OperationCanceledException(e.getMessage());
-            }
-        }
-        else
-        {
-            return new RefactoringStatus();
-        }
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor monitor) throws CoreException,
-        OperationCanceledException
-    {
-        if (changes.isEmpty())
-        {
-            return new NullChange();
-        }
-        else
-        {
-            CompositeChange ret = new CompositeChange("Export-Package update");
-
-            ret.addAll(changes.toArray(new Change[changes.size()]));
-
-            return ret;
-        }
-    }
-
-    @Override
-    public String getName()
-    {
-        return "Sigil package move participant";
-    }
-
-    @Override
-    protected boolean initialize(Object element)
-    {
-        this.packageFragment = (IPackageFragment) element;
-        return true;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RefactorUtil.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RefactorUtil.java
deleted file mode 100644
index 1fa8d50..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RefactorUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.ModelHelper;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.ResourceChangeChecker;
-
-/**
- * @author dave
- *
- */
-class RefactorUtil
-{
-    static final void touch(CheckConditionsContext context, ISigilProjectModel sigil)
-    {
-        ResourceChangeChecker checker = (ResourceChangeChecker) context.getChecker(ResourceChangeChecker.class);
-        IResourceChangeDescriptionFactory deltaFactory = checker.getDeltaFactory();
-        IFile file = sigil.getProject().getFile(SigilCore.SIGIL_PROJECT_FILE);
-        deltaFactory.change(file);
-    }    
-    
-    static void createNewImport(RefactoringStatus status, List<Change> changes, ISigilProjectModel project,
-        IPackageExport export)
-    {
-        IPackageImport newImport = ModelElementFactory.getInstance().newModelElement(
-            IPackageImport.class);
-        newImport.setPackageName(export.getPackageName());
-        newImport.setVersions(ModelHelper.getDefaultRange(export.getVersion()));
-
-        status.addInfo("Creating new import in " + project.getSymbolicName());
-        changes.add(new ImportPackageChange(project, null, newImport));
-    }
-
-    static IPackageExport createNewExport(RefactoringStatus status,
-        List<Change> changes, ISigilProjectModel project, String packageName)
-    {
-        IPackageExport newExport = ModelElementFactory.getInstance().newModelElement(
-            IPackageExport.class);
-        newExport.setPackageName(packageName);
-        // new export inherits project version by default
-        newExport.setVersion(project.getVersion());
-
-        status.addInfo("Creating new export " + packageName + " in "
-            + project.getSymbolicName());
-        changes.add(new ExportPackageChange(project, null, newExport));
-        return newExport;
-    }    
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RenameActivatorPackageParticipant.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RenameActivatorPackageParticipant.java
deleted file mode 100644
index d62c501..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RenameActivatorPackageParticipant.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.NullChange;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
-
-public class RenameActivatorPackageParticipant extends RenameParticipant
-{
-    private IPackageFragment packageFragment;
-    private List<Change> changes = new LinkedList<Change>();
-
-    @Override
-    public RefactoringStatus checkConditions(IProgressMonitor monitor,
-        CheckConditionsContext ctx) throws OperationCanceledException
-    {
-        RefactoringStatus status = null;
-        if (getArguments().getUpdateReferences())
-        {
-            try
-            {
-                ISigilProjectModel sigil = SigilCore.create(packageFragment.getJavaProject().getProject());
-                RefactorUtil.touch(ctx, sigil);
-
-                String oldName = sigil.getBundle().getBundleInfo().getActivator();
-                if (oldName != null)
-                {
-                    String[] parts = splitPackageClass(oldName);
-                    if (parts[0].equals(packageFragment.getElementName()))
-                    {
-                        String newName = getArguments().getNewName() + "." + parts[1];
-                        changes.add(new BundleActivatorChange(sigil, oldName, newName));
-                        status = RefactoringStatus.createInfoStatus("Updating bundle activator from "
-                            + oldName + " to " + newName);
-                    }
-                }
-            }
-            catch (CoreException e)
-            {
-                SigilCore.warn("Failed to update activator", e);
-            }
-        }
-
-        return status;
-    }
-
-    private static String[] splitPackageClass(String className)
-    {
-        String[] parts = new String[2];
-        int i = className.lastIndexOf('.');
-        if (i == -1)
-        {
-            parts[0] = "";
-            parts[1] = className;
-        }
-        else
-        {
-            parts[0] = className.substring(0, i);
-            parts[1] = className.substring(i + 1);
-        }
-        return parts;
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor monitor) throws CoreException,
-        OperationCanceledException
-    {
-        if (changes.isEmpty())
-        {
-            return new NullChange();
-        }
-        else
-        {
-            CompositeChange ret = new CompositeChange("Export-Package update");
-
-            ret.addAll(changes.toArray(new Change[changes.size()]));
-
-            return ret;
-        }
-    }
-
-    @Override
-    public String getName()
-    {
-        return "Sigil Rename Activator Package Participant";
-    }
-
-    @Override
-    protected boolean initialize(Object element)
-    {
-        packageFragment = (IPackageFragment) element;
-        return true;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RenameActivatorParticipant.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RenameActivatorParticipant.java
deleted file mode 100644
index 60b6d81..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RenameActivatorParticipant.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.NullChange;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
-
-public class RenameActivatorParticipant extends RenameParticipant
-{
-    private ICompilationUnit compilationUnit;
-    private List<Change> changes = new LinkedList<Change>();
-
-    @Override
-    public RefactoringStatus checkConditions(IProgressMonitor monitor,
-        CheckConditionsContext ctx) throws OperationCanceledException
-    {
-        RefactoringStatus status = null;
-        if (getArguments().getUpdateReferences())
-        {
-            IPackageFragment pf = (IPackageFragment) compilationUnit.getAncestor(IJavaModel.PACKAGE_FRAGMENT);
-            String oldName = qualifiedName(pf, compilationUnit.getElementName());
-            try
-            {
-                ISigilProjectModel sigil = SigilCore.create(compilationUnit.getJavaProject().getProject());
-                if (oldName.equals(sigil.getBundle().getBundleInfo().getActivator()))
-                {
-                    String newName = qualifiedName(pf, getArguments().getNewName());
-
-                    RefactorUtil.touch(ctx, sigil);
-                    changes.add(new BundleActivatorChange(sigil, oldName, newName));
-                    status = RefactoringStatus.createInfoStatus("Updating bundle activator from "
-                        + oldName + " to " + newName);
-                }
-            }
-            catch (CoreException e)
-            {
-                SigilCore.warn("Failed to update activator", e);
-            }
-        }
-
-        return status;
-    }
-
-    /**
-     * @param pf 
-     * @param compilationUnit2
-     * @return
-     */
-    private static String qualifiedName(IPackageFragment pf, String name)
-    {
-        name = name.substring(0, name.lastIndexOf('.'));
-        return pf.getElementName() + '.' + name;
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor monitor) throws CoreException,
-        OperationCanceledException
-    {
-        if (changes.isEmpty())
-        {
-            return new NullChange();
-        }
-        else
-        {
-            CompositeChange ret = new CompositeChange("Export-Package update");
-
-            ret.addAll(changes.toArray(new Change[changes.size()]));
-
-            return ret;
-        }
-    }
-
-    @Override
-    public String getName()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    protected boolean initialize(Object element)
-    {
-        compilationUnit = (ICompilationUnit) element;
-        return true;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RenamePackageParticipant.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RenamePackageParticipant.java
deleted file mode 100644
index 36382de..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/refactor/RenamePackageParticipant.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.refactor;
-
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.ModelHelper;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.NullChange;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
-
-public class RenamePackageParticipant extends RenameParticipant
-{
-    private IPackageFragment packageFragment;
-    private List<Change> changes = new LinkedList<Change>();
-
-    @Override
-    public RefactoringStatus checkConditions(IProgressMonitor pm,
-        CheckConditionsContext context) throws OperationCanceledException
-    {
-        RefactoringStatus status = new RefactoringStatus();
-
-        if (getArguments().getUpdateReferences())
-        {
-            try
-            {
-                ISigilProjectModel sigil = SigilCore.create(packageFragment.getJavaProject().getProject());
-                final String packageName = packageFragment.getElementName();
-
-                SigilCore.log("Rename checkConditions " + packageName);
-
-                IPackageExport oldExport = ModelHelper.findExport(sigil, packageName);
-
-                if (oldExport != null)
-                {
-                    // record change to check if out of sync...
-                    RefactorUtil.touch(context, sigil);
-
-                    status = RefactoringStatus.createWarningStatus("Package "
-                        + packageName
-                        + " is exported. Renaming this package may effect bundles outside of this workspace");
-                    SigilCore.log("Export Package " + packageName + " renamed to "
-                        + getArguments().getNewName());
-
-                    IPackageExport newExport = ModelElementFactory.getInstance().newModelElement(
-                        IPackageExport.class);
-                    newExport.setPackageName(getArguments().getNewName());
-                    newExport.setVersion(oldExport.getVersion());
-
-                    changes.add(new ExportPackageChange(sigil, oldExport, newExport));
-
-                    for (ISigilProjectModel other : SigilCore.getRoot().getProjects())
-                    {
-                        if (!sigil.equals(other))
-                        {
-                            // record change to check if out of sync...
-                            RefactorUtil.touch(context, other);
-                        }
-                        changes.add(createImportChange(status, other, oldExport,
-                            newExport));
-                    }
-                }
-            }
-            catch (CoreException e)
-            {
-                SigilCore.warn("Failed to create export package refactor", e);
-                throw new OperationCanceledException(
-                    "Failed to create export package refactor");
-            }
-        }
-        return status;
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor pm) throws CoreException,
-        OperationCanceledException
-    {
-        if (changes.isEmpty())
-        {
-            return new NullChange();
-        }
-        else
-        {
-            CompositeChange ret = new CompositeChange("Export-Package update");
-
-            ret.addAll(changes.toArray(new Change[changes.size()]));
-
-            return ret;
-        }
-    }
-
-    @Override
-    public String getName()
-    {
-        return "Sigil export package rename participant";
-    }
-
-    @Override
-    protected boolean initialize(Object element)
-    {
-        this.packageFragment = (IPackageFragment) element;
-        return true;
-    }
-
-    private Change createImportChange(RefactoringStatus status, ISigilProjectModel sigil,
-        IPackageExport oldExport, IPackageExport newExport)
-    {
-        IBundleModelElement info = sigil.getBundle().getBundleInfo();
-        Collection<IPackageImport> imports = info.getImports();
-
-        for (IPackageImport oldImport : imports)
-        {
-            if (oldImport.accepts(oldExport))
-            {
-                IPackageImport newImport = ModelElementFactory.getInstance().newModelElement(
-                    IPackageImport.class);
-
-                newImport.setPackageName(newExport.getPackageName());
-                newImport.setVersions(oldImport.getVersions());
-
-                status.addInfo(buildImportChangeMsg(sigil, oldImport, newImport));
-
-                return new ImportPackageChange(sigil, oldImport, newImport);
-            }
-        }
-
-        // ok no change
-        return new NullChange();
-    }
-
-    private static final String buildImportChangeMsg(ISigilProjectModel sigil,
-        IPackageImport oldImport, IPackageImport newImport)
-    {
-        return "Updating import " + oldImport.getPackageName() + " version "
-            + oldImport.getVersions() + " to " + newImport.getPackageName() + " version "
-            + newImport.getVersions() + " in project " + sigil.getSymbolicName()
-            + " version " + sigil.getVersion();
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/FileSystemRepositoryWizard.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/FileSystemRepositoryWizard.java
deleted file mode 100644
index 1c27230..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/FileSystemRepositoryWizard.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.repository;
-
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizard;
-
-public class FileSystemRepositoryWizard extends RepositoryWizard
-{
-    @Override
-    public void addPages()
-    {
-        addPage(new FileSystemRepositoryWizardPage(this));
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/FileSystemRepositoryWizardPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/FileSystemRepositoryWizardPage.java
deleted file mode 100644
index 96a5374..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/FileSystemRepositoryWizardPage.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.repository;
-
-import java.io.File;
-
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizard;
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizardPage;
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.DirectoryFieldEditor;
-import org.eclipse.jface.wizard.IWizardPage;
-
-public class FileSystemRepositoryWizardPage extends RepositoryWizardPage implements IWizardPage
-{
-
-    private DirectoryFieldEditor dirEditor;
-
-    protected FileSystemRepositoryWizardPage(RepositoryWizard parent)
-    {
-        super("File System Repository", parent);
-    }
-
-    @Override
-    public void createFieldEditors()
-    {
-        dirEditor = new DirectoryFieldEditor("dir", "Directory:", getFieldEditorParent());
-        addField(dirEditor);
-        addField(new BooleanFieldEditor("recurse", "Recurse:", getFieldEditorParent()));
-    }
-
-    @Override
-    protected void checkPageComplete()
-    {
-        super.checkPageComplete();
-        if (isPageComplete())
-        {
-            setPageComplete(dirEditor.getStringValue().length() > 0);
-            if (isPageComplete())
-            {
-                if (new File(dirEditor.getStringValue()).isDirectory())
-                {
-                    setPageComplete(true);
-                    setErrorMessage(null);
-                }
-                else
-                {
-                    setPageComplete(false);
-                    setErrorMessage("Invalid directory");
-                }
-            }
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/OSGiInstallRepositoryWizard.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/OSGiInstallRepositoryWizard.java
deleted file mode 100644
index 0afef2e..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/OSGiInstallRepositoryWizard.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.repository;
-
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizard;
-
-public class OSGiInstallRepositoryWizard extends RepositoryWizard
-{
-    @Override
-    public void addPages()
-    {
-        addPage(new OSGiInstallRepositoryWizardPage(this));
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/OSGiInstallRepositoryWizardPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/OSGiInstallRepositoryWizardPage.java
deleted file mode 100644
index 83a1f96..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/repository/OSGiInstallRepositoryWizardPage.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.repository;
-
-import java.util.ArrayList;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.install.IOSGiInstall;
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizard;
-import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizardPage;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-
-public class OSGiInstallRepositoryWizardPage extends RepositoryWizardPage
-{
-
-    protected OSGiInstallRepositoryWizardPage(RepositoryWizard parent)
-    {
-        super("OSGi Install Repository", parent);
-    }
-
-    @Override
-    public void createFieldEditors()
-    {
-        ArrayList<String[]> installs = new ArrayList<String[]>();
-        for (String id : SigilCore.getInstallManager().getInstallIDs())
-        {
-            IOSGiInstall i = SigilCore.getInstallManager().findInstall(id);
-            installs.add(new String[] { i.getType().getName(), id });
-        }
-        String[][] strs = installs.toArray(new String[installs.size()][]);
-
-        RadioGroupFieldEditor editor = new RadioGroupFieldEditor("id", "Install", 1,
-            strs, getFieldEditorParent());
-
-        addField(editor);
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/startup/SigilStartup.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/startup/SigilStartup.java
deleted file mode 100644
index d29655d..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/startup/SigilStartup.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.startup;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.felix.sigil.common.repository.IRepositoryChangeListener;
-import org.apache.felix.sigil.common.repository.RepositoryChangeEvent;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.job.ResolveProjectsJob;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.ui.IStartup;
-
-public class SigilStartup implements IStartup
-{
-
-    public void earlyStartup()
-    {
-        final AtomicInteger updateCounter = new AtomicInteger();
-
-        // Register a repository change listener to re-run the resolver when repository changes
-        SigilCore.getGlobalRepositoryManager().addRepositoryChangeListener(
-            new IRepositoryChangeListener()
-            {
-                public void repositoryChanged(RepositoryChangeEvent event)
-                {
-                    if (!SigilUI.WORKSPACE_REPOSITORY_ID.equals(event.getRepository().getId()))
-                    {
-                        final int update = updateCounter.incrementAndGet();
-
-                        Job job = new Job("Pending repository update")
-                        {
-                            @Override
-                            protected IStatus run(IProgressMonitor monitor)
-                            {
-                                if (update == updateCounter.get())
-                                {
-                                    IWorkspace workspace = ResourcesPlugin.getWorkspace();
-                                    ResolveProjectsJob job = new ResolveProjectsJob(
-                                        workspace);
-                                    job.setSystem(true);
-                                    job.schedule();
-                                }
-                                return Status.OK_STATUS;
-                            }
-
-                        };
-                        job.setSystem(true);
-                        job.schedule(100);
-                    }
-                    //else {
-                    //   Repository changes are handled by ProjectResourceListener 
-                    //}
-                }
-            });
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/ModelElementComparator.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/ModelElementComparator.java
deleted file mode 100644
index f1a3c70..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/ModelElementComparator.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.sigil.eclipse.ui.internal.views;
-
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.eclipse.jface.viewers.ContentViewer;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-
-public class ModelElementComparator extends ViewerComparator
-{
-    private static final int EXPORT_GROUP = 0;
-    private static final int IMPORT_GROUP = 1;
-    private static final int REQUIRE_GROUP = 2;
-    private static final int OTHER_GROUP = 4;
-
-    public int category(Object element)
-    {
-        if (element instanceof IPackageImport)
-        {
-            return IMPORT_GROUP;
-        }
-        else if (element instanceof IPackageExport)
-        {
-            return EXPORT_GROUP;
-        }
-        else if (element instanceof IRequiredBundle)
-        {
-            return REQUIRE_GROUP;
-        }
-        else
-        {
-            return OTHER_GROUP;
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public int compare(Viewer viewer, Object e1, Object e2)
-    {
-        int cat1 = category(e1);
-        int cat2 = category(e2);
-
-        if (cat1 != cat2)
-        {
-            return cat1 - cat2;
-        }
-
-        if (cat1 == OTHER_GROUP)
-        {
-            String name1;
-            String name2;
-
-            if (viewer == null || !(viewer instanceof ContentViewer))
-            {
-                name1 = e1.toString();
-                name2 = e2.toString();
-            }
-            else
-            {
-                IBaseLabelProvider prov = ((ContentViewer) viewer).getLabelProvider();
-                if (prov instanceof ILabelProvider)
-                {
-                    ILabelProvider lprov = (ILabelProvider) prov;
-                    name1 = lprov.getText(e1);
-                    name2 = lprov.getText(e2);
-                }
-                else
-                {
-                    name1 = e1.toString();
-                    name2 = e2.toString();
-                }
-            }
-            if (name1 == null)
-            {
-                name1 = "";//$NON-NLS-1$
-            }
-            if (name2 == null)
-            {
-                name2 = "";//$NON-NLS-1$
-            }
-
-            // use the comparator to compare the strings
-            return getComparator().compare(name1, name2);
-        }
-        else
-        {
-            Comparable c1 = (Comparable) e1;
-            Comparable c2 = (Comparable) e2;
-            return c1.compareTo(c2);
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/RepositoryViewPart.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/RepositoryViewPart.java
deleted file mode 100644
index fe3aeab..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/RepositoryViewPart.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.views;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map.Entry;
-
-import org.apache.felix.sigil.common.model.ICompoundModelElement;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryChangeListener;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-import org.apache.felix.sigil.common.repository.RepositoryChangeEvent;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.util.ModelHelper;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.actions.RefreshRepositoryAction;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTreeContentProvider;
-import org.apache.felix.sigil.eclipse.ui.util.ModelLabelProvider;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-
-public class RepositoryViewPart extends ViewPart implements IRepositoryChangeListener
-{
-
-    public class FindUsersAction extends Action
-    {
-        @Override
-        public String getText()
-        {
-            return "Find Uses";
-        }
-
-        @Override
-        public void run()
-        {
-            ISelection s = treeViewer.getSelection();
-            if (!s.isEmpty())
-            {
-                IStructuredSelection sel = (IStructuredSelection) s;
-                IModelElement e = (IModelElement) sel.getFirstElement();
-                List<IModelElement> users = ModelHelper.findUsers(e);
-                String msg = null;
-                if (users.isEmpty())
-                {
-                    msg = "No users of " + e;
-                }
-                else
-                {
-                    StringBuilder b = new StringBuilder();
-                    for (IModelElement u : users)
-                    {
-                        ISigilBundle bndl = u.getAncestor(ISigilBundle.class);
-                        b.append(bndl);
-                        b.append("->");
-                        b.append(u);
-                        b.append("\n");
-                    }
-                    msg = b.toString();
-                }
-                MessageDialog.openInformation(getViewSite().getShell(), "Information",
-                    msg);
-            }
-        }
-    }
-
-    class RepositoryAction extends Action
-    {
-        final IBundleRepository rep;
-        final IRepositoryModel model;
-
-        public RepositoryAction(IBundleRepository rep)
-        {
-            this.rep = rep;
-            this.model = SigilCore.getRepositoryModel(rep);
-        }
-
-        @Override
-        public void run()
-        {
-            treeViewer.setInput(rep);
-            tableViewer.setInput(rep);
-            createMenu();
-        }
-
-        @Override
-        public String getText()
-        {
-            String name = model.getName();
-            if (treeViewer.getInput() == rep)
-            {
-                name = "> " + name;
-            }
-            return name;
-        }
-
-        @Override
-        public ImageDescriptor getImageDescriptor()
-        {
-            Image img = model.getType().getIcon();
-            if (img == null)
-            {
-                return ImageDescriptor.createFromFile(RepositoryViewPart.class,
-                    "/icons/repository.gif");
-            }
-            else
-            {
-                return ImageDescriptor.createFromImage(img);
-            }
-        }
-    }
-
-    class CollapseAction extends Action
-    {
-        @Override
-        public void run()
-        {
-            treeViewer.collapseAll();
-        }
-
-        @Override
-        public String getText()
-        {
-            return "Collapse All";
-        }
-
-        @Override
-        public ImageDescriptor getImageDescriptor()
-        {
-            return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
-                ISharedImages.IMG_ELCL_COLLAPSEALL);
-        }
-    }
-
-    class RefreshAction extends Action
-    {
-        @Override
-        public void run()
-        {
-            IBundleRepository rep = (IBundleRepository) treeViewer.getInput();
-            if (rep != null)
-            {
-                new RefreshRepositoryAction(rep).run();
-            }
-        }
-
-        @Override
-        public String getText()
-        {
-            return "Refresh";
-        }
-
-        @Override
-        public ImageDescriptor getImageDescriptor()
-        {
-
-            return ImageDescriptor.createFromFile(RepositoryViewPart.class,
-                "/icons/bundle-refresh.gif");
-        }
-
-    }
-
-    private TreeViewer treeViewer;
-    private TableViewer tableViewer;
-
-    @Override
-    public void createPartControl(Composite parent)
-    {
-        createBody(parent);
-        createMenu();
-        SigilCore.getGlobalRepositoryManager().addRepositoryChangeListener(this);
-    }
-
-    @Override
-    public void dispose()
-    {
-        SigilCore.getGlobalRepositoryManager().removeRepositoryChangeListener(this);
-        super.dispose();
-    }
-
-    private void createMenu()
-    {
-        createTopMenu();
-        createLocalMenu();
-    }
-
-    private void createLocalMenu()
-    {
-        /*MenuManager menuMgr = new MenuManager();
-        menuMgr.add( new FindUsersAction() );
-        Menu menu = menuMgr.createContextMenu(treeViewer.getControl());
-
-        treeViewer.getControl().setMenu(menu);
-        getViewSite().registerContextMenu(menuMgr, treeViewer); */
-        IActionBars bars = getViewSite().getActionBars();
-        IToolBarManager toolBar = bars.getToolBarManager();
-        toolBar.add(new RefreshAction());
-        toolBar.add(new CollapseAction());
-    }
-
-    private void createTopMenu()
-    {
-        IActionBars bars = getViewSite().getActionBars();
-        IMenuManager menu = bars.getMenuManager();
-        menu.removeAll();
-        for (final IBundleRepository rep : SigilCore.getGlobalRepositoryManager().getRepositories())
-        {
-            if (treeViewer.getInput() == null)
-            {
-                treeViewer.setInput(rep);
-                tableViewer.setInput(rep);
-            }
-
-            RepositoryAction action = new RepositoryAction(rep);
-            menu.add(action);
-        }
-    }
-
-    private void createBody(Composite parent)
-    {
-        // components
-        Composite control = new Composite(parent, SWT.NONE);
-        Table table = new Table(control, SWT.SINGLE);
-        table.setHeaderVisible(true);
-        Tree tree = new Tree(control, SWT.NONE);
-
-        // layout
-        control.setLayout(new GridLayout(1, false));
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
-        // viewers
-        createPropertiesViewer(table);
-        createContentsViewer(tree);
-    }
-
-    /**
-     * @param tree
-     */
-    private void createContentsViewer(Tree tree)
-    {
-        treeViewer = new TreeViewer(tree);
-        treeViewer.setContentProvider(new DefaultTreeContentProvider()
-        {
-            public Object[] getChildren(Object parentElement)
-            {
-                if (parentElement instanceof ICompoundModelElement)
-                {
-                    ICompoundModelElement model = (ICompoundModelElement) parentElement;
-                    return model.children();
-                }
-
-                return null;
-            }
-
-            public Object getParent(Object element)
-            {
-                if (element instanceof IModelElement)
-                {
-                    IModelElement model = (IModelElement) element;
-                    return model.getParent();
-                }
-
-                return null;
-            }
-
-            public boolean hasChildren(Object element)
-            {
-                if (element instanceof ICompoundModelElement)
-                {
-                    ICompoundModelElement model = (ICompoundModelElement) element;
-                    return model.children().length > 0;
-                }
-                return false;
-            }
-
-            public Object[] getElements(Object inputElement)
-            {
-                IBundleRepository rep = (IBundleRepository) inputElement;
-                IRepositoryModel model = SigilCore.getRepositoryModel(rep);
-                if ( model.getProblem() == null ) {
-                    return getBundles(rep);
-                }
-                else {
-                    return new Object[] { model.getProblem() };
-                }
-            }
-        });
-
-        treeViewer.setComparator(new ModelElementComparator());
-
-        treeViewer.setLabelProvider(new ModelLabelProvider());
-
-        treeViewer.addDragSupport(DND.DROP_LINK,
-            new Transfer[] { LocalSelectionTransfer.getTransfer() },
-            new DragSourceAdapter()
-            {
-                @Override
-                public void dragFinished(DragSourceEvent event)
-                {
-                    // TODO Auto-generated method stub
-                    super.dragFinished(event);
-                }
-
-                @Override
-                public void dragSetData(DragSourceEvent event)
-                {
-                    // TODO Auto-generated method stub
-                    super.dragSetData(event);
-                }
-
-                @SuppressWarnings("unchecked")
-                @Override
-                public void dragStart(DragSourceEvent event)
-                {
-                    if (treeViewer.getSelection().isEmpty())
-                    {
-                        IStructuredSelection sel = (IStructuredSelection) treeViewer.getSelection();
-                        for (Iterator<IModelElement> i = sel.iterator(); i.hasNext();)
-                        {
-                            IModelElement e = i.next();
-                            if (e instanceof ISigilBundle)
-                            {
-                                event.data = e;
-                            }
-                            else
-                            {
-                                event.doit = false;
-                            }
-                        }
-                    }
-                    else
-                    {
-                        event.doit = false;
-                    }
-                }
-            });
-    }
-
-    /**
-     * @param table
-     */
-    private void createPropertiesViewer(Table table)
-    {
-        tableViewer = new TableViewer(table);
-        tableViewer.setContentProvider(new DefaultTableProvider() {
-
-            public Object[] getElements(Object inputElement)
-            {
-                IBundleRepository rep = (IBundleRepository) inputElement;
-                IRepositoryModel model = SigilCore.getRepositoryModel(rep);
-                return toArray(model.getProperties().entrySet());
-            }            
-        });
-                
-        TableViewerColumn keyCol = new TableViewerColumn(tableViewer, SWT.NONE);
-        keyCol.getColumn().setText("Key");
-        keyCol.getColumn().setWidth(100);
-        keyCol.setLabelProvider(new ColumnLabelProvider() {
-            @SuppressWarnings("unchecked")
-            @Override
-            public String getText(Object element)
-            {
-                Entry<String, String> entry = (Entry<String, String>) element;
-                return entry.getKey();
-            }            
-        });
-        
-        TableViewerColumn valCol = new TableViewerColumn(tableViewer, SWT.NONE);
-        valCol.getColumn().setText("Value");
-        valCol.getColumn().setWidth(500);
-        valCol.setLabelProvider(new ColumnLabelProvider() {
-            @SuppressWarnings("unchecked")
-            @Override
-            public String getText(Object element)
-            {
-                Entry<String, String> entry = (Entry<String, String>) element;
-                return entry.getValue();
-            }            
-        });
-    }
-
-    @Override
-    public void setFocus()
-    {
-    }
-
-    public void repositoryChanged(RepositoryChangeEvent event)
-    {
-        switch (event.getType())
-        {
-            case ADDED:
-                createTopMenu();
-                break;
-            case CHANGED:
-                if (event.getRepository() == treeViewer.getInput())
-                {
-                    SigilUI.runInUI(new Runnable()
-                    {
-                        public void run()
-                        {
-                            treeViewer.refresh();
-                        }
-                    });
-                }
-                break;
-            case REMOVED:
-                if (event.getRepository() == treeViewer.getInput())
-                {
-                    treeViewer.setInput(null);
-                }
-                createTopMenu();
-        }
-    }
-
-    private Object[] getBundles(IBundleRepository repository)
-    {
-        final LinkedList<ISigilBundle> bundles = new LinkedList<ISigilBundle>();
-        repository.accept(new IRepositoryVisitor()
-        {
-            public boolean visit(ISigilBundle bundle)
-            {
-                bundles.add(bundle);
-                return true;
-            }
-        });
-        return bundles.toArray();
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleConnectionHighlighter.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleConnectionHighlighter.java
deleted file mode 100644
index 0f32001..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleConnectionHighlighter.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.views.resolution;
-
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.zest.core.widgets.GraphConnection;
-import org.eclipse.zest.core.widgets.GraphItem;
-import org.eclipse.zest.core.widgets.GraphNode;
-
-public class BundleConnectionHighlighter implements ISelectionChangedListener
-{
-
-    private BundleResolverView view;
-
-    public BundleConnectionHighlighter(BundleResolverView view)
-    {
-        this.view = view;
-    }
-
-    public void selectionChanged(SelectionChangedEvent event)
-    {
-        ISelection selection = event.getSelection();
-        if (!selection.isEmpty())
-        {
-            IStructuredSelection str = (IStructuredSelection) selection;
-
-            Object sel = str.getFirstElement();
-
-            if (sel instanceof ISigilBundle)
-            {
-                BundleGraph graph = (BundleGraph) view.getBundlegraph();
-
-                ISigilBundle selected = (ISigilBundle) sel;
-                Set<ISigilBundle> connected = graph.getTargets(selected);
-
-                highlightLinks(graph, selected, connected);
-                highlightBundles(graph, selected, connected);
-            }
-            else if (sel instanceof Link)
-            {
-                GraphConnection c = (GraphConnection) findGraphItem(sel);
-                if (c != null)
-                {
-                    c.unhighlight();
-                    c.setHighlightColor(ColorConstants.blue);
-                    c.highlight();
-                }
-            }
-        }
-        else
-        {
-            // TODO clear highlights...
-        }
-    }
-
-    private void highlightBundles(BundleGraph graph, ISigilBundle selected,
-        Set<ISigilBundle> connected)
-    {
-        for (ISigilBundle bundle : graph.getBundles())
-        {
-            GraphNode node = (GraphNode) findGraphItem(bundle);
-            if (node != null)
-            {
-                node.unhighlight();
-
-                if (bundle == selected)
-                {
-                    node.setHighlightColor(ColorConstants.yellow);
-                    node.highlight();
-                }
-                else if (view.isDisplayed(BundleResolverView.DEPENDENTS))
-                {
-                    if (connected.contains(bundle))
-                    {
-                        node.setHighlightColor(ColorConstants.lightBlue);
-                        node.highlight();
-                    }
-                }
-            }
-        }
-    }
-
-    private void highlightLinks(BundleGraph graph, ISigilBundle selected,
-        Set<ISigilBundle> connected)
-    {
-        for (Link l : graph.getLinks())
-        {
-            GraphConnection c = (GraphConnection) findGraphItem(l);
-            if (c != null)
-            {
-                c.unhighlight();
-
-                if (view.isDisplayed(BundleResolverView.DEPENDENTS))
-                {
-                    if (l.getSource() == selected && connected.contains(l.getTarget()))
-                    {
-                        c.setHighlightColor(ColorConstants.lightBlue);
-                        c.highlight();
-                    }
-                }
-            }
-        }
-    }
-
-    private GraphItem findGraphItem(Object l)
-    {
-        try
-        {
-            return view.getGraphViewer().findGraphItem(l);
-        }
-        catch (ArrayIndexOutOfBoundsException e)
-        {
-            // temporary fix for issue 
-            // https://bugs.eclipse.org/bugs/show_bug.cgi?id=242523
-            return null;
-        }
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraph.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraph.java
deleted file mode 100644
index fc8562d..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraph.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.sigil.eclipse.ui.internal.views.resolution;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-
-public class BundleGraph
-{
-
-    private HashMap<ISigilBundle, LinkedList<Link>> lookup = new HashMap<ISigilBundle, LinkedList<Link>>();
-    private LinkedList<Link> links = new LinkedList<Link>();
-    private HashSet<ISigilBundle> bundles = new HashSet<ISigilBundle>();
-
-    public void startResolution(IModelElement requirement)
-    {
-    }
-
-    public void endResolution(IModelElement requirement, ISigilBundle target)
-    {
-        ISigilBundle source = requirement.getAncestor(ISigilBundle.class);
-
-        bundles.add(source);
-        bundles.add(target);
-
-        LinkedList<Link> links = lookup.get(source);
-
-        if (links == null)
-        {
-            links = new LinkedList<Link>();
-            lookup.put(source, links);
-        }
-
-        Link l = null;
-        for (Link c : links)
-        {
-            if (c.getTarget() == target)
-            {
-                l = c;
-                break;
-            }
-        }
-
-        if (l == null)
-        {
-            l = new Link(source, target);
-            links.add(l);
-            this.links.add(l);
-        }
-
-        l.addRequirement(requirement);
-    }
-
-    public List<Link> getLinks()
-    {
-        return links;
-    }
-
-    public Set<ISigilBundle> getBundles()
-    {
-        return bundles;
-    }
-
-    public Set<ISigilBundle> getTargets(ISigilBundle bundle)
-    {
-        HashSet<ISigilBundle> targets = new HashSet<ISigilBundle>();
-
-        for (Link l : getLinks(bundle))
-        {
-            targets.add(l.getTarget());
-        }
-
-        return targets;
-    }
-
-    public List<Link> getLinks(ISigilBundle selected)
-    {
-        List<Link> l = lookup.get(selected);
-        return l == null ? Collections.<Link> emptyList() : l;
-    }
-
-    public List<Link> getDependentLinks(ISigilBundle bundle)
-    {
-        ArrayList<Link> found = new ArrayList<Link>(links.size());
-
-        for (Link l : links)
-        {
-            if (l.getTarget() == bundle)
-            {
-                found.add(l);
-            }
-        }
-
-        found.trimToSize();
-
-        return found;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraphContentProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraphContentProvider.java
deleted file mode 100644
index 345dcfd..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraphContentProvider.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.views.resolution;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.zest.core.viewers.IGraphContentProvider;
-
-public class BundleGraphContentProvider implements IGraphContentProvider
-{
-
-    public Object[] getElements(Object input)
-    {
-        BundleGraph graph = (BundleGraph) input;
-        return graph.getLinks().toArray();
-    }
-
-    public Object getDestination(Object element)
-    {
-        Link l = (Link) element;
-        return l.isSatisfied() ? l.getTarget() : new Link.Unsatisfied();
-    }
-
-    public Object getSource(Object element)
-    {
-        Link l = (Link) element;
-        return l.getSource();
-    }
-
-    public void dispose()
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-    {
-
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraphLabelProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraphLabelProvider.java
deleted file mode 100644
index 2e090bf..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraphLabelProvider.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.views.resolution;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-public class BundleGraphLabelProvider extends LabelProvider
-{
-
-    private BundleResolverView view;
-
-    public BundleGraphLabelProvider(BundleResolverView view)
-    {
-        this.view = view;
-    }
-
-    @Override
-    public String getText(Object element)
-    {
-        if (element instanceof Link)
-        {
-            Link l = (Link) element;
-            if (l.isSatisfied())
-            {
-                if (view.isDisplayed(BundleResolverView.LINK_LABELS))
-                {
-                    return view.getLinkText((Link) element);
-                }
-                else
-                {
-                    return "";
-                }
-            }
-            else
-            {
-                return view.getLinkText((Link) element);
-            }
-        }
-        else if (element instanceof ISigilBundle)
-        {
-            ISigilBundle b = (ISigilBundle) element;
-            return b.getBundleInfo().getSymbolicName() + ": "
-                + b.getBundleInfo().getVersion();
-        }
-        else if (element instanceof Link.Unsatisfied)
-        {
-            return "unsatisfied";
-        }
-        else
-        {
-            return "unknown:" + element;
-        }
-    }
-
-    @Override
-    public Image getImage(Object element)
-    {
-        Image result = null;
-        if (element instanceof ISigilBundle)
-        {
-            result = SigilUI.cacheImage("icons/bundle.gif",
-                BundleGraphLabelProvider.class.getClassLoader());
-        }
-        else if (element instanceof Link.Unsatisfied)
-        {
-            return PlatformUI.getWorkbench().getSharedImages().getImage(
-                ISharedImages.IMG_OBJS_ERROR_TSK);
-        }
-
-        return result;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraphViewFilter.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraphViewFilter.java
deleted file mode 100644
index 353c5bb..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleGraphViewFilter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.views.resolution;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-public class BundleGraphViewFilter extends ViewerFilter
-{
-
-    private BundleResolverView view;
-
-    public BundleGraphViewFilter(BundleResolverView view)
-    {
-        this.view = view;
-    }
-
-    @Override
-    public boolean select(Viewer viewer, Object parentElement, Object element)
-    {
-        if (!view.isDisplayed(BundleResolverView.LOCAL_LINKS))
-        {
-            if (element instanceof Link)
-            {
-                Link l = (Link) element;
-                return l.getSource() != l.getTarget();
-            }
-        }
-        if (!view.isDisplayed(BundleResolverView.SATISFIED))
-        {
-            if (element instanceof Link)
-            {
-                Link l = (Link) element;
-                return !l.isSatisfied();
-            }
-            else if (element instanceof ISigilBundle)
-            {
-                ISigilBundle bundle = (ISigilBundle) element;
-                for (Link l : view.getBundlegraph().getLinks(bundle))
-                {
-                    if (!l.isSatisfied())
-                    {
-                        return true;
-                    }
-                }
-                return false;
-            }
-        }
-
-        if (!view.isDisplayed(BundleResolverView.UNSATISFIED))
-        {
-            if (element instanceof Link)
-            {
-                Link l = (Link) element;
-                return l.isSatisfied();
-            }
-            else if (element instanceof Link.Unsatisfied)
-            {
-                return false;
-            }
-        }
-        return true;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleResolverView.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleResolverView.java
deleted file mode 100644
index ac7eac4..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleResolverView.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.views.resolution;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IBundleResolver;
-import org.apache.felix.sigil.common.repository.IRepositoryManager;
-import org.apache.felix.sigil.common.repository.IResolutionMonitor;
-import org.apache.felix.sigil.common.repository.ResolutionConfig;
-import org.apache.felix.sigil.common.repository.ResolutionException;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.repository.ResolutionMonitorAdapter;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IPartService;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.zest.core.viewers.GraphViewer;
-import org.eclipse.zest.core.widgets.Graph;
-import org.eclipse.zest.core.widgets.GraphConnection;
-import org.eclipse.zest.layouts.LayoutStyles;
-import org.eclipse.zest.layouts.algorithms.RadialLayoutAlgorithm;
-import org.eclipse.zest.layouts.algorithms.TreeLayoutAlgorithm;
-
-public class BundleResolverView extends ViewPart
-{
-
-    private static final String SHOW_LINK_LABELS = "Show link labels";
-    private static final String HIDE_LINK_LABELS = "Hide link labels";
-    private static final String SHOW_LOCAL_LINKS = "Show local links";
-    private static final String HIDE_LOCAL_LINKS = "Hide local links";
-    private static final String SHOW_DEPENDENTS = "Show dependents";
-    private static final String HIDE_DEPENDENTS = "Hide dependents";
-    private static final String SHOW_SATISFIED = "Show satisfied bundles";
-    private static final String HIDE_SATISFIED = "Hide satisfied bundles";
-    private static final String SHOW_UNSATISFIED = "Show unsatisfied bundles";
-    private static final String HIDE_UNSATISFIED = "Hide unsatisfied bundles";
-    private static final String SHOW_OPTIONAL = "Show optional dependencies";
-    private static final String HIDE_OPTIONAL = "Hide optional dependencies";
-
-    public static final String LINK_LABELS = "link.labels";
-    public static final String LOCAL_LINKS = "local.links";
-    public static final String DEPENDENTS = "dependents";
-    public static final String SATISFIED = "satisified";
-    public static final String UNSATISFIED = "unsatisfied";
-    public static final String OPTIONAL = "optional";
-
-    private GraphViewer viewer;
-    private IModelElement current;
-    private Job job;
-    private int lastX;
-    private int lastY;
-
-    private Map<String, Boolean> displayed = new HashMap<String, Boolean>();
-    private org.eclipse.swt.widgets.Label repoPath;
-    private Composite viewComposite;
-
-    private class ToggleDisplayAction extends Action
-    {
-        private String key;
-        private String showMsg;
-        private String hideMsg;
-
-        ToggleDisplayAction(String key, String showMsg, String hideMsg)
-        {
-            this.key = key;
-            this.showMsg = showMsg;
-            this.hideMsg = hideMsg;
-            setText(BundleResolverView.this.isDisplayed(key) ? hideMsg : showMsg);
-        }
-
-        @Override
-        public void run()
-        {
-            BundleResolverView.this.setDisplayed(key,
-                !BundleResolverView.this.isDisplayed(key));
-            setText(BundleResolverView.this.isDisplayed(key) ? hideMsg : showMsg);
-        }
-    }
-
-    public void setInput(final IModelElement element)
-    {
-        if (current == null || !current.equals(element))
-        {
-            SigilCore.log("Set input " + element);
-            current = element;
-            redraw();
-        }
-    }
-
-    public void setDisplayed(String key, boolean b)
-    {
-        displayed.put(key, b);
-
-        if (key == DEPENDENTS)
-        {
-            int style = LayoutStyles.NO_LAYOUT_NODE_RESIZING;
-            viewer.setLayoutAlgorithm(b ? new TreeLayoutAlgorithm(style)
-                : new RadialLayoutAlgorithm(style));
-            redraw();
-        }
-        else if (key == OPTIONAL)
-        {
-            redraw();
-        }
-        else if (key == SATISFIED || key == UNSATISFIED)
-        {
-            viewer.refresh();
-        }
-    }
-
-    public boolean isDisplayed(String key)
-    {
-        return displayed.get(key);
-    }
-
-    @Override
-    public void setFocus()
-    {
-    }
-
-    @Override
-    public void createPartControl(Composite parent)
-    {
-        init();
-        parent.setLayout(new FillLayout());
-        Composite composite = new Composite(parent, SWT.NONE);
-        createRepoPath(composite);
-        createViewer(composite);
-        doLayout(composite);
-        createListeners();
-        createMenu();
-    }
-
-    public BundleGraph getBundlegraph()
-    {
-        return (BundleGraph) viewer.getInput();
-    }
-
-    GraphViewer getGraphViewer()
-    {
-        return viewer;
-    }
-
-    String getLinkText(Link link)
-    {
-        StringBuffer buf = new StringBuffer();
-
-        for (IModelElement e : link.getRequirements())
-        {
-            if (buf.length() > 0)
-            {
-                buf.append("\n");
-            }
-            if (e instanceof IPackageImport)
-            {
-                IPackageImport pi = (IPackageImport) e;
-                buf.append("import " + pi.getPackageName() + " : " + pi.getVersions()
-                    + ": " + (pi.isOptional() ? "optional" : "mandatory"));
-            }
-            else if (e instanceof IRequiredBundle)
-            {
-                IRequiredBundle rb = (IRequiredBundle) e;
-                buf.append("required bundle " + rb.getSymbolicName() + " : "
-                    + rb.getVersions() + ": "
-                    + (rb.isOptional() ? "optional" : "mandatory"));
-            }
-        }
-
-        return buf.toString();
-    }
-
-    private synchronized void redraw()
-    {
-        final IModelElement element = current;
-        if (job != null)
-        {
-            job.cancel();
-        }
-
-        ISigilProjectModel project = findProject(element);        
-        final IRepositoryManager repository = project == null ? SigilCore.getGlobalRepositoryManager() : project.getRepositoryManager();
-        
-        StringBuilder buf = new StringBuilder();
-        
-        for (IBundleRepository rep : repository.getRepositories()) {
-            IRepositoryModel mod = SigilCore.getRepositoryModel(rep);
-            if ( buf.length() > 0 ) {
-                buf.append(" -> ");                
-            }
-            buf.append(mod.getName());
-        }
-        
-        buf.insert(0, "Repository Path: ");
-        repoPath.setText(buf.toString());
-
-        job = new Job("Resolving " + element)
-        {
-            @Override
-            protected IStatus run(IProgressMonitor progress)
-            {
-                try
-                {
-                    resolve(element, repository.getBundleResolver(), progress);
-                    return Status.OK_STATUS;
-                }
-                catch (CoreException e)
-                {
-                    return e.getStatus();
-                }
-            }
-        };
-        job.schedule();
-    }
-
-    private void resolve(IModelElement element, IBundleResolver resolver, IProgressMonitor progress)
-        throws CoreException
-    {
-        final BundleGraph graph = new BundleGraph();
-
-        IResolutionMonitor monitor = new ResolutionMonitorAdapter(progress)
-        {
-            @Override
-            public void startResolution(IModelElement requirement)
-            {
-                graph.startResolution(requirement);
-            }
-
-            @Override
-            public void endResolution(IModelElement requirement, ISigilBundle provider)
-            {
-                graph.endResolution(requirement, provider);
-            }
-        };
-
-        int options = ResolutionConfig.IGNORE_ERRORS;
-
-        if (isDisplayed(DEPENDENTS))
-        {
-            options |= ResolutionConfig.INCLUDE_DEPENDENTS;
-        }
-        if (isDisplayed(OPTIONAL))
-        {
-            options |= ResolutionConfig.INCLUDE_OPTIONAL;
-        }
-
-        ResolutionConfig config = new ResolutionConfig(options);
-
-        try
-        {
-            resolver.resolve(element, config, monitor);
-        }
-        catch (ResolutionException e)
-        {
-            throw SigilCore.newCoreException("Failed to resolve " + element, e);
-        }
-
-        SigilUI.runInUI(new Runnable()
-        {
-            public void run()
-            {
-                viewer.setInput(graph);
-                addCustomUIElements();
-            }
-        });
-    }
-
-    private static ISigilProjectModel findProject(IModelElement element)
-    {
-        if (element == null)
-        {
-            return null;
-        }
-        if (element instanceof ISigilProjectModel)
-        {
-            return (ISigilProjectModel) element;
-        }
-
-        return element.getAncestor(ISigilProjectModel.class);
-    }
-
-    @SuppressWarnings("unchecked")
-    private void addCustomUIElements()
-    {
-        if (!isDisplayed(LINK_LABELS))
-        {
-            for (GraphConnection c : (List<GraphConnection>) viewer.getGraphControl().getConnections())
-            {
-                if (c.getData() instanceof Link)
-                {
-                    c.setTooltip(buildToolTip((Link) c.getData()));
-                }
-            }
-        }
-    }
-
-    private IFigure buildToolTip(Link link)
-    {
-        Label l = new Label();
-        l.setText(getLinkText(link));
-        return l;
-    }
-
-    /**
-     * @param composite
-     */
-    private void createRepoPath(Composite composite)
-    {
-        repoPath = new org.eclipse.swt.widgets.Label(composite, SWT.NONE);
-    }
-
-    private void init()
-    {
-        displayed.put(LINK_LABELS, false);
-        displayed.put(LOCAL_LINKS, false);
-        displayed.put(DEPENDENTS, false);
-        displayed.put(OPTIONAL, false);
-        displayed.put(SATISFIED, true);
-        displayed.put(UNSATISFIED, true);
-    }
-
-    private void createViewer(Composite parent)
-    {
-        viewComposite = new Composite(parent, SWT.NONE);
-        viewComposite.setLayout(new FillLayout());
-        viewer = new GraphViewer(viewComposite, SWT.H_SCROLL | SWT.V_SCROLL);
-        IContentProvider contentProvider = new BundleGraphContentProvider();
-        viewer.setContentProvider(contentProvider);
-        viewer.setLabelProvider(new BundleGraphLabelProvider(this));
-        viewer.addFilter(new BundleGraphViewFilter(this));
-
-        int style = LayoutStyles.NO_LAYOUT_NODE_RESIZING;
-        viewer.setLayoutAlgorithm(isDisplayed(DEPENDENTS) ? new TreeLayoutAlgorithm(style)
-            : new RadialLayoutAlgorithm(style));
-        viewer.addSelectionChangedListener(new BundleConnectionHighlighter(this));
-        viewer.setInput(new BundleGraph());
-    }
-
-    /**
-     * @param parent 
-     * 
-     */
-    private void doLayout(Composite parent)
-    {
-        parent.setLayout(new GridLayout(1, true));
-        repoPath.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        viewComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-    }
-
-    private void createMenu()
-    {
-        IActionBars action = getViewSite().getActionBars();
-        action.getMenuManager().add(
-            new ToggleDisplayAction(LINK_LABELS, SHOW_LINK_LABELS, HIDE_LINK_LABELS));
-        action.getMenuManager().add(
-            new ToggleDisplayAction(LOCAL_LINKS, SHOW_LOCAL_LINKS, HIDE_LOCAL_LINKS));
-        action.getMenuManager().add(
-            new ToggleDisplayAction(DEPENDENTS, SHOW_DEPENDENTS, HIDE_DEPENDENTS));
-        action.getMenuManager().add(
-            new ToggleDisplayAction(OPTIONAL, SHOW_OPTIONAL, HIDE_OPTIONAL));
-        action.getMenuManager().add(
-            new ToggleDisplayAction(SATISFIED, SHOW_SATISFIED, HIDE_SATISFIED));
-        action.getMenuManager().add(
-            new ToggleDisplayAction(UNSATISFIED, SHOW_UNSATISFIED, HIDE_UNSATISFIED));
-        action.updateActionBars();
-    }
-
-    private void createListeners()
-    {
-        IPartService ps = (IPartService) getViewSite().getService(IPartService.class);
-        ps.addPartListener(new EditorViewPartListener(this));
-        viewer.getGraphControl().addControlListener(new ControlAdapter()
-        {
-            @Override
-            public void controlResized(ControlEvent e)
-            {
-                Graph g = (Graph) e.getSource();
-                int x = g.getSize().x;
-                int y = g.getSize().y;
-                if (lastX != x || lastY != y)
-                {
-                    lastX = x;
-                    lastY = y;
-                    redraw();
-                }
-            }
-        });
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/EditorViewPartListener.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/EditorViewPartListener.java
deleted file mode 100644
index bb884b3..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/EditorViewPartListener.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.sigil.eclipse.ui.internal.views.resolution;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IWorkbenchPartReference;
-
-public class EditorViewPartListener implements IPartListener2
-{
-
-    private BundleResolverView bundleResolverView;
-
-    public EditorViewPartListener(BundleResolverView bundleResolverView)
-    {
-        this.bundleResolverView = bundleResolverView;
-    }
-
-    public void partActivated(IWorkbenchPartReference partRef)
-    {
-        checkRef(partRef);
-    }
-
-    public void partBroughtToTop(IWorkbenchPartReference partRef)
-    {
-        // no action
-    }
-
-    public void partClosed(IWorkbenchPartReference partRef)
-    {
-        // no action
-    }
-
-    public void partDeactivated(IWorkbenchPartReference partRef)
-    {
-        // no action
-    }
-
-    public void partHidden(IWorkbenchPartReference partRef)
-    {
-        // no action
-    }
-
-    public void partInputChanged(IWorkbenchPartReference partRef)
-    {
-        // no action
-    }
-
-    public void partOpened(IWorkbenchPartReference partRef)
-    {
-        // no action
-    }
-
-    public void partVisible(IWorkbenchPartReference partRef)
-    {
-        // no action
-    }
-
-    private void checkRef(IWorkbenchPartReference partRef)
-    {
-        IEditorPart editor = partRef.getPage().getActiveEditor();
-        if (editor != null)
-        {
-            IEditorInput input = editor.getEditorInput();
-            if (input instanceof IFileEditorInput)
-            {
-                IFileEditorInput f = (IFileEditorInput) input;
-                IProject project = f.getFile().getProject();
-                if ( SigilCore.isSigilProject(project)) {
-                    try
-                    {
-                        ISigilProjectModel model = SigilCore.create(project);
-                        if (model != null)
-                        {
-                            bundleResolverView.setInput(model);
-                        }
-                    }
-                    catch (CoreException e)
-                    {
-                        SigilCore.error("Failed to update resolver view", e);
-                    }
-                }
-            }
-        }
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/Link.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/Link.java
deleted file mode 100644
index fe77cc4..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/Link.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.views.resolution;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-
-public class Link
-{
-    public static class Unsatisfied
-    {
-
-    }
-
-    private ISigilBundle source;
-    private ISigilBundle target;
-
-    private LinkedList<IModelElement> requirements = new LinkedList<IModelElement>();
-    private static final Comparator<IModelElement> comparator = new Comparator<IModelElement>()
-    {
-
-        public int compare(IModelElement o1, IModelElement o2)
-        {
-            if (o1 instanceof IRequiredBundle)
-            {
-                if (o2 instanceof IRequiredBundle)
-                {
-                    return compareBundles((IRequiredBundle) o1, (IRequiredBundle) o2);
-                }
-                else
-                {
-                    return -1;
-                }
-            }
-            else
-            {
-                if (o2 instanceof IRequiredBundle)
-                {
-                    return 1;
-                }
-                else
-                {
-                    return compareNonBundles(o1, o2);
-                }
-            }
-        }
-
-        private int compareNonBundles(IModelElement o1, IModelElement o2)
-        {
-            if (o1 instanceof IPackageImport)
-            {
-                if (o2 instanceof IPackageImport)
-                {
-                    return compareImports((IPackageImport) o1, (IPackageImport) o2);
-                }
-                else
-                {
-                    return -1;
-                }
-            }
-            else
-            {
-                if (o2 instanceof IPackageImport)
-                {
-                    return 1;
-                }
-                else
-                {
-                    return 0;
-                }
-            }
-        }
-
-        private int compareImports(IPackageImport o1, IPackageImport o2)
-        {
-            return o1.getPackageName().compareTo(o2.getPackageName());
-        }
-
-        private int compareBundles(IRequiredBundle o1, IRequiredBundle o2)
-        {
-            return o1.getSymbolicName().compareTo(o2.getSymbolicName());
-        }
-
-    };
-
-    public Link(ISigilBundle source, ISigilBundle target)
-    {
-        this.source = source;
-        this.target = target;
-    }
-
-    public ISigilBundle getSource()
-    {
-        return source;
-    }
-
-    public ISigilBundle getTarget()
-    {
-        return target;
-    }
-
-    public boolean isSatisfied()
-    {
-        return target != null;
-    }
-
-    public void addRequirement(IModelElement requirement)
-    {
-        requirements.add(requirement);
-        Collections.sort(requirements, comparator);
-    }
-
-    public String toString()
-    {
-        return "Link[" + source + "->" + target + "]";
-    }
-
-    public List<IModelElement> getRequirements()
-    {
-        return requirements;
-    }
-
-    public boolean isOptional()
-    {
-        for (IModelElement e : requirements)
-        {
-            if (e instanceof IPackageImport)
-            {
-                IPackageImport pi = (IPackageImport) e;
-                if (!pi.isOptional())
-                {
-                    return false;
-                }
-            }
-            else if (e instanceof IRequiredBundle)
-            {
-                IRequiredBundle rb = (IRequiredBundle) e;
-                if (!rb.isOptional())
-                {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/wizard/SigilNewResourceWizard.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/wizard/SigilNewResourceWizard.java
deleted file mode 100644
index 128a803..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/wizard/SigilNewResourceWizard.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.wizard;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-
-/**
- * @author dave
- *
- */
-public abstract class SigilNewResourceWizard extends BasicNewResourceWizard implements INewWizard
-{
-
-    protected void selectRevealAndShow(IFile file)
-    {
-        selectAndReveal(file);
-
-        // Open editor on new file.
-        IWorkbenchWindow dw = getWorkbench().getActiveWorkbenchWindow();
-        try
-        {
-            if (dw != null)
-            {
-                IWorkbenchPage page = dw.getActivePage();
-                if (page != null)
-                {
-                    IDE.openEditor(page, file, true);
-                }
-            }
-        }
-        catch (PartInitException e)
-        {
-            MessageDialog.openError(Display.getCurrent().getActiveShell(),
-                "Initialisation error", "Failed to open " + file);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/wizard/WorkspaceContentProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/wizard/WorkspaceContentProvider.java
deleted file mode 100644
index d60c7a8..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/wizard/WorkspaceContentProvider.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-public class WorkspaceContentProvider implements ITreeContentProvider
-{
-
-    private final boolean includeNonSigil;
-    private final boolean includeClosed;
-
-    public WorkspaceContentProvider(boolean includeNonSigil, boolean includeClosed)
-    {
-        this.includeNonSigil = includeNonSigil;
-        this.includeClosed = includeClosed;
-    }
-
-    public Object[] getChildren(Object parentElement)
-    {
-        Object[] result = null;
-
-        if (parentElement instanceof IWorkspace)
-        {
-            IProject[] projects = ((IWorkspace) parentElement).getRoot().getProjects();
-            if (includeNonSigil && includeClosed)
-            {
-                result = projects;
-            }
-            else
-            {
-                List<IProject> includedProjects = new ArrayList<IProject>(projects.length);
-                for (IProject project : projects)
-                {
-                    if (!includeClosed && !project.isOpen())
-                    {
-                        continue;
-                    }
-
-                    if (!includeNonSigil)
-                    {
-                        try
-                        {
-                            if (project.getNature(SigilCore.NATURE_ID) == null)
-                            {
-                                continue;
-                            }
-                        }
-                        catch (CoreException e)
-                        {
-                            continue;
-                        }
-                    }
-
-                    includedProjects.add(project);
-                }
-                result = includedProjects.toArray(new IProject[includedProjects.size()]);
-            }
-        }
-        else if (parentElement instanceof IContainer)
-        {
-            try
-            {
-                IResource[] members = ((IContainer) parentElement).members();
-                List<IResource> children = new ArrayList<IResource>(members.length);
-                for (int i = 0; i < members.length; i++)
-                {
-                    if (members[i].getType() != IResource.FILE)
-                    {
-                        children.add(members[i]);
-                    }
-                }
-                result = children.toArray(new IResource[children.size()]);
-            }
-            catch (CoreException e)
-            {
-                // Shouldn't happen
-            }
-        }
-
-        return result;
-    }
-
-    public Object getParent(Object element)
-    {
-        if (element instanceof IResource)
-        {
-            return ((IResource) element).getParent();
-        }
-        return null;
-    }
-
-    public boolean hasChildren(Object element)
-    {
-        return (element instanceof IContainer) && ((IContainer) element).isAccessible();
-    }
-
-    public Object[] getElements(Object inputElement)
-    {
-        return getChildren(inputElement);
-    }
-
-    public void dispose()
-    {
-    }
-
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-    {
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/AccumulatorAdapter.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/AccumulatorAdapter.java
deleted file mode 100644
index e44a064..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/AccumulatorAdapter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.Collection;
-import java.util.LinkedList;
-
-public abstract class AccumulatorAdapter<E> implements IAccumulator<E>
-{
-    public void addElement(E element)
-    {
-        LinkedList<E> list = new LinkedList<E>();
-        list.add(element);
-        addElements(list);
-    };
-
-    public void addElements(Collection<? extends E> elements)
-    {
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/BackgroundLoadingSelectionDialog.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/BackgroundLoadingSelectionDialog.java
deleted file mode 100644
index 52e90f9..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/BackgroundLoadingSelectionDialog.java
+++ /dev/null
@@ -1,608 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.fieldassist.ContentProposalAdapter;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.fieldassist.IContentProposal;
-import org.eclipse.jface.fieldassist.IContentProposalListener;
-import org.eclipse.jface.fieldassist.TextContentAdapter;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IOpenListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.OpenEvent;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.progress.IJobRunnable;
-
-public class BackgroundLoadingSelectionDialog<E> extends TitleAreaDialog implements IAccumulator<E>
-{
-
-    private final ILabelProvider DEFAULT_LABEL_PROVIDER = new LabelProvider()
-    {
-        @SuppressWarnings("unchecked")
-        public String getText(Object element)
-        {
-            String result;
-            if (element instanceof WrappedContentProposal<?>)
-            {
-                WrappedContentProposal<E> contentProposal = (org.apache.felix.sigil.eclipse.ui.util.WrappedContentProposal<E>) element;
-                result = contentProposal.getLabel();
-            }
-            else
-            {
-                result = descriptor.getLabel((E) element);
-            }
-            return result;
-        }
-    };
-
-    private final IElementDescriptor<E> DEFAULT_DESCRIPTOR = new IElementDescriptor<E>()
-    {
-        public String getLabel(E element)
-        {
-            return getName(element);
-        }
-
-        public String getName(E element)
-        {
-            return element == null ? "null" : element.toString();
-        }
-    };
-
-    private final String selectionLabel;
-    private IFilter<? super E> filter;
-    private IElementDescriptor<? super E> descriptor = DEFAULT_DESCRIPTOR;
-    private ILabelProvider labelProvider = DEFAULT_LABEL_PROVIDER;
-    private final boolean multi;
-
-    private final List<E> elements;
-
-    private List<E> selection = null;
-    private String selectedName = null;
-
-    private TableViewer viewer = null;
-    private Comparator<? super E> comparator;
-
-    private HashMap<String, IJobRunnable> background = new HashMap<String, IJobRunnable>();
-
-    public BackgroundLoadingSelectionDialog(Shell parentShell, String selectionLabel, boolean multi)
-    {
-        super(parentShell);
-        elements = new ArrayList<E>();
-        this.selectionLabel = selectionLabel;
-        this.multi = multi;
-    }
-
-    public void setFilter(IFilter<? super E> filter)
-    {
-        this.filter = filter;
-    }
-
-    public void setDescriptor(final IElementDescriptor<? super E> descriptor)
-    {
-        if (descriptor != null)
-        {
-            this.descriptor = descriptor;
-        }
-        else
-        {
-            this.descriptor = DEFAULT_DESCRIPTOR;
-        }
-    }
-
-    public IElementDescriptor<? super E> getDescriptor()
-    {
-        return descriptor;
-    }
-
-    public void setComparator(Comparator<? super E> comparator)
-    {
-        this.comparator = comparator;
-    }
-
-    public void setLabelProvider(ILabelProvider labelProvider)
-    {
-        if (labelProvider != null)
-        {
-            this.labelProvider = labelProvider;
-        }
-        else
-        {
-            this.labelProvider = DEFAULT_LABEL_PROVIDER;
-        }
-    }
-
-    public void addBackgroundJob(String name, IJobRunnable job)
-    {
-        background.put(name, job);
-    }
-
-    @Override
-    public int open()
-    {
-        Job[] jobs = scheduleJobs();
-        try
-        {
-            return super.open();
-        }
-        finally
-        {
-            for (Job j : jobs)
-            {
-                j.cancel();
-            }
-        }
-    }
-
-    private Job[] scheduleJobs()
-    {
-        if (background.isEmpty())
-        {
-            return new Job[] {};
-        }
-        else
-        {
-            ArrayList<Job> jobs = new ArrayList<Job>(background.size());
-            for (Map.Entry<String, IJobRunnable> e : background.entrySet())
-            {
-                final IJobRunnable run = e.getValue();
-                Job job = new Job(e.getKey())
-                {
-                    @Override
-                    protected IStatus run(IProgressMonitor monitor)
-                    {
-                        return run.run(monitor);
-                    }
-                };
-                job.schedule();
-            }
-
-            return jobs.toArray(new Job[jobs.size()]);
-        }
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent)
-    {
-        // Create Controls
-        Composite container = (Composite) super.createDialogArea(parent);
-        Composite composite = new Composite(container, SWT.NONE);
-
-        new Label(composite, SWT.NONE).setText(selectionLabel);
-
-        ContentProposalAdapter proposalAdapter = null;
-        Text txtSelection = null;
-
-        Table table = null;
-        if (multi)
-        {
-            table = new Table(composite, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
-            viewer = new TableViewer(table);
-            viewer.setContentProvider(new ArrayContentProvider());
-            viewer.addFilter(new ViewerFilter()
-            {
-                public boolean select(Viewer viewer, Object parentElement, Object element)
-                {
-                    @SuppressWarnings("unchecked")
-                    E castedElement = (E) element;
-                    return filter == null || filter.select(castedElement);
-                }
-            });
-            if (comparator != null)
-            {
-                viewer.setSorter(new ViewerSorter()
-                {
-                    @Override
-                    public int compare(Viewer viewer, Object o1, Object o2)
-                    {
-                        @SuppressWarnings("unchecked")
-                        E e1 = (E) o1;
-                        @SuppressWarnings("unchecked")
-                        E e2 = (E) o2;
-                        return comparator.compare(e1, e2);
-                    }
-                });
-            }
-            synchronized (elements)
-            {
-                viewer.setInput(elements);
-            }
-
-            if (labelProvider != null)
-            {
-                viewer.setLabelProvider(labelProvider);
-            }
-        }
-        else
-        {
-            txtSelection = new Text(composite, SWT.BORDER);
-            ControlDecoration selectionDecor = new ControlDecoration(txtSelection,
-                SWT.LEFT | SWT.TOP);
-            FieldDecoration proposalDecor = FieldDecorationRegistry.getDefault().getFieldDecoration(
-                FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
-            selectionDecor.setImage(proposalDecor.getImage());
-            selectionDecor.setDescriptionText(proposalDecor.getDescription());
-
-            ExclusionContentProposalProvider<E> proposalProvider = new ExclusionContentProposalProvider<E>(
-                elements, filter, descriptor);
-
-            proposalAdapter = new ContentProposalAdapter(txtSelection,
-                new TextContentAdapter(), proposalProvider, null, null);
-            proposalAdapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
-            if (labelProvider != null)
-            {
-                proposalAdapter.setLabelProvider(labelProvider);
-            }
-
-            if (selectedName != null)
-            {
-                txtSelection.setText(selectedName);
-            }
-        }
-        updateSelection();
-        updateButtons();
-
-        // Hookup listeners
-        if (proposalAdapter != null)
-        {
-            proposalAdapter.addContentProposalListener(new IContentProposalListener()
-            {
-                public void proposalAccepted(IContentProposal proposal)
-                {
-                    @SuppressWarnings("unchecked")
-                    WrappedContentProposal<E> valueProposal = (org.apache.felix.sigil.eclipse.ui.util.WrappedContentProposal<E>) proposal;
-                    E selected = valueProposal.getElement();
-                    selection = new ArrayList<E>(1);
-                    selection.add(selected);
-
-                    elementSelected(selected);
-
-                    updateButtons();
-                }
-            });
-        }
-        if (txtSelection != null)
-        {
-            txtSelection.addModifyListener(new ModifyListener()
-            {
-                public void modifyText(ModifyEvent e)
-                {
-                    selectedName = ((Text) e.widget).getText();
-                    updateButtons();
-                }
-            });
-        }
-        if (viewer != null)
-        {
-            viewer.addSelectionChangedListener(new ISelectionChangedListener()
-            {
-                public void selectionChanged(SelectionChangedEvent event)
-                {
-                    IStructuredSelection sel = (IStructuredSelection) event.getSelection();
-                    selection = new ArrayList<E>(sel.size());
-                    for (Iterator<?> iter = sel.iterator(); iter.hasNext();)
-                    {
-                        @SuppressWarnings("unchecked")
-                        E element = (E) iter.next();
-                        selection.add(element);
-                    }
-                    updateButtons();
-                }
-            });
-            viewer.addOpenListener(new IOpenListener()
-            {
-                public void open(OpenEvent event)
-                {
-                    if (canComplete())
-                    {
-                        setReturnCode(IDialogConstants.OK_ID);
-                        close();
-                    }
-                }
-            });
-        }
-
-        // Layout
-        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        if (multi)
-        {
-            composite.setLayout(new GridLayout(1, false));
-            GridData layoutTable = new GridData(SWT.FILL, SWT.FILL, true, true);
-            layoutTable.heightHint = 200;
-            table.setLayoutData(layoutTable);
-        }
-        else
-        {
-            composite.setLayout(new GridLayout(2, false));
-            txtSelection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        }
-
-        return container;
-    }
-
-    protected void elementSelected(E selection)
-    {
-    }
-
-    @Override
-    protected Control createButtonBar(Composite parent)
-    {
-        Control bar = super.createButtonBar(parent);
-        updateButtons();
-        return bar;
-    }
-
-    /**
-     * Can be called from any thread
-     */
-    protected final void updateButtons()
-    {
-        Runnable updateButtonsRunnable = new Runnable()
-        {
-            public void run()
-            {
-                Shell shell = getShell();
-                if (shell != null && !shell.isDisposed())
-                {
-                    Button okButton = getButton(IDialogConstants.OK_ID);
-                    if (okButton != null && !okButton.isDisposed())
-                    {
-                        okButton.setEnabled(canComplete());
-                    }
-                }
-            }
-        };
-        Shell shell = getShell();
-        if (shell != null)
-        {
-            onUIThread(shell, updateButtonsRunnable);
-        }
-    }
-
-    /**
-     * Subclasses may override but must call super.canComplete
-     * @return
-     */
-    protected synchronized boolean canComplete()
-    {
-        boolean result = false;
-
-        if (selection != null)
-        {
-            if (multi)
-            {
-                result = selection.size() > 0;
-            }
-            else
-            {
-                E sel = getSelectedElement();
-                result = sel != null && descriptor.getName(sel).equals(selectedName);
-            }
-        }
-
-        return result;
-    }
-
-    public final void addElement(E added)
-    {
-        addElements(Collections.singleton(added));
-    }
-
-    /**
-     * Can be called from any thread
-     */
-    public final void addElements(Collection<? extends E> added)
-    {
-        final LinkedList<E> toAdd = new LinkedList<E>();
-        synchronized (elements)
-        {
-            for (E e : added)
-            {
-                if (!elements.contains(e))
-                {
-                    elements.add(e);
-                    toAdd.add(e);
-                }
-            }
-            Collections.sort(elements, comparator);
-        }
-        if (viewer != null)
-        {
-            onUIThread(viewer.getControl(), new Runnable()
-            {
-                public void run()
-                {
-                    if (!viewer.getControl().isDisposed())
-                    {
-                        viewer.add(toAdd.toArray());
-                        viewer.refresh();
-                    }
-                }
-            });
-        }
-        else
-        {
-
-        }
-        updateSelection();
-        updateButtons();
-    }
-
-    protected void updateSelection()
-    {
-        onUIThread(getShell(), new Runnable()
-        {
-            public void run()
-            {
-                if (selectedName != null)
-                {
-                    ArrayList<E> newSelection = new ArrayList<E>();
-                    synchronized (elements)
-                    {
-                        for (E e : elements)
-                        {
-                            if (selectedName.equals(descriptor.getName(e)))
-                            {
-                                newSelection.add(e);
-                                break;
-                            }
-                        }
-                    }
-                    selection = newSelection;
-                }
-                else
-                {
-                    selection = Collections.emptyList();
-                }
-                if (viewer != null && !viewer.getControl().isDisposed())
-                {
-                    viewer.setSelection(selection.isEmpty() ? StructuredSelection.EMPTY
-                        : new StructuredSelection(selection));
-                }
-            }
-        });
-    }
-
-    private static final void onUIThread(Control control, Runnable r)
-    {
-        if (control != null && !control.isDisposed())
-        {
-            try
-            {
-                Display display = control.getDisplay();
-                if (Thread.currentThread() == display.getThread())
-                {
-                    // We are on the UI thread already, just do the work
-                    r.run();
-                }
-                else
-                {
-                    // Not on the UI thread, need to bung over the runnable
-                    display.asyncExec(r);
-                }
-            }
-            catch (SWTError e)
-            {
-                if (e.code == SWT.ERROR_WIDGET_DISPOSED)
-                {
-                    // ignore
-                }
-                else
-                {
-                    throw e;
-                }
-            }
-        }
-    }
-
-    public String getSelectedName()
-    {
-        return selectedName;
-    }
-
-    public void setSelectedName(String selectedName)
-    {
-        this.selectedName = selectedName;
-        boolean change = false;
-        if (selectedName == null)
-        {
-            if (selection != null && !selection.isEmpty())
-            {
-                change = true;
-            }
-        }
-        else
-        {
-            if (selection == null)
-            {
-                change = true;
-            }
-            else if (selection.size() != 1
-                || !descriptor.getLabel(selection.get(0)).equals(selectedName))
-            {
-                change = true;
-            }
-        }
-
-        if (change)
-        {
-            updateSelection();
-            updateButtons();
-        }
-    }
-
-    public List<E> getSelectedElements()
-    {
-        return selection;
-    }
-
-    public E getSelectedElement()
-    {
-        E result;
-        if (selection == null || selection.isEmpty())
-        {
-            result = null;
-        }
-        else
-        {
-            result = selection.get(0);
-        }
-        return result;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultContentProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultContentProvider.java
deleted file mode 100644
index 88c46e3..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultContentProvider.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-public class DefaultContentProvider implements IContentProvider
-{
-
-    public void dispose()
-    {
-    }
-
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-    {
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultLabelProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultLabelProvider.java
deleted file mode 100644
index c6800c5..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultLabelProvider.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-
-public abstract class DefaultLabelProvider implements IBaseLabelProvider, ILabelProvider
-{
-
-    public boolean isLabelProperty(Object element, String property)
-    {
-        return false;
-    }
-
-    public void dispose()
-    {
-    }
-
-    public void addListener(ILabelProviderListener listener)
-    {
-    }
-
-    public void removeListener(ILabelProviderListener listener)
-    {
-    }
-
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultTableProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultTableProvider.java
deleted file mode 100644
index cad03b8..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultTableProvider.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.Collection;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-
-public abstract class DefaultTableProvider extends DefaultContentProvider implements IStructuredContentProvider
-{
-
-    /**
-     * Utility method to convert the input element to an Object[].
-     * 
-     * @param inputElement
-     * 
-     * @return if inputElement is null -> empty array <br/>
-     *         if inputElement is a {@link Collection} returns {@link Collection#toArray()}<br/>
-     *         if inputElement is an Array class cast of inputElement to Object[]<br/>
-     *  
-     * @throws IllegalArgumentException if the element cannot be converted. 
-     */
-    public Object[] toArray(Object inputElement)
-    {
-        if (inputElement == null)
-        {
-            return new Object[] {};
-        }
-        else if (inputElement instanceof Collection<?>)
-        {
-            Collection<?> col = (Collection<?>) inputElement;
-            return col.toArray();
-        }
-        else if (inputElement.getClass().isArray())
-        {
-            return (Object[]) inputElement;
-        }
-        else
-        {
-            throw new IllegalArgumentException("Invalid inputElement "
-                + inputElement.getClass());
-        }
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultTreeContentProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultTreeContentProvider.java
deleted file mode 100644
index 5b6580e..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/DefaultTreeContentProvider.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-public abstract class DefaultTreeContentProvider extends DefaultContentProvider implements ITreeContentProvider
-{
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ExclusionContentProposalProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ExclusionContentProposalProvider.java
deleted file mode 100644
index ee3d07d..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ExclusionContentProposalProvider.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.felix.sigil.utils.GlobCompiler;
-import org.eclipse.jface.fieldassist.IContentProposal;
-import org.eclipse.jface.fieldassist.IContentProposalProvider;
-
-public class ExclusionContentProposalProvider<T> implements IContentProposalProvider
-{
-
-    private final Collection<? extends T> elements;
-    private final IFilter<? super T> filter;
-    private final IElementDescriptor<? super T> descriptor;
-
-    public ExclusionContentProposalProvider(Collection<? extends T> elements, IFilter<? super T> filter, IElementDescriptor<? super T> descriptor)
-    {
-        this.elements = elements;
-        this.filter = filter;
-        this.descriptor = descriptor;
-    }
-
-    public IContentProposal[] getProposals(String contents, int position)
-    {
-        String matchString = contents.substring(0, position);
-        Pattern pattern = GlobCompiler.compile(matchString);
-
-        // Get a snapshot of the elements
-        T[] elementArray;
-        synchronized (elements)
-        {
-            @SuppressWarnings("unchecked")
-            T[] temp = (T[]) elements.toArray();
-            elementArray = temp;
-        }
-
-        List<IContentProposal> result = new ArrayList<IContentProposal>();
-
-        for (T element : elementArray)
-        {
-            if (filter == null || filter.select(element))
-            {
-                IContentProposal proposal = WrappedContentProposal.newInstance(element,
-                    descriptor);
-                Matcher matcher = pattern.matcher(proposal.getContent());
-                if (matcher.find())
-                {
-                    result.add(proposal);
-                }
-            }
-        }
-
-        return result.toArray(new IContentProposal[result.size()]);
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ExportedPackageFinder.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ExportedPackageFinder.java
deleted file mode 100644
index 6b268b1..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ExportedPackageFinder.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.progress.IJobRunnable;
-
-public class ExportedPackageFinder implements IJobRunnable
-{
-
-    private final IAccumulator<? super IPackageExport> accumulator;
-    private final ISigilProjectModel sigil;
-
-    public ExportedPackageFinder(ISigilProjectModel sigil, IAccumulator<? super IPackageExport> accumulator)
-    {
-        this.sigil = sigil;
-        this.accumulator = accumulator;
-    }
-
-    public IStatus run(final IProgressMonitor monitor)
-    {
-        final List<IPackageExport> exports = new ArrayList<IPackageExport>(
-            ResourcesDialogHelper.UPDATE_BATCH_SIZE);
-        final IModelWalker walker = new IModelWalker()
-        {
-            public boolean visit(IModelElement element)
-            {
-                if (element instanceof IPackageExport)
-                {
-                    IPackageExport pkgExport = (IPackageExport) element;
-                    exports.add(pkgExport);
-
-                    if (exports.size() >= ResourcesDialogHelper.UPDATE_BATCH_SIZE)
-                    {
-                        accumulator.addElements(exports);
-                        exports.clear();
-                    }
-                }
-                return !monitor.isCanceled();
-            }
-        };
-        sigil.getRepositoryManager().visit(walker);
-        if (exports.size() > 0)
-        {
-            accumulator.addElements(exports);
-        }
-
-        return Status.OK_STATUS;
-    }
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/FileUtils.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/FileUtils.java
deleted file mode 100644
index 51160e0..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/FileUtils.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-public class FileUtils
-{
-    public static void loadFile(Shell shell, Text text, String msg, boolean isDirectory)
-    {
-        if (isDirectory)
-        {
-            DirectoryDialog dialog = new DirectoryDialog(shell, SWT.NONE);
-            dialog.setMessage(msg);
-            String value = dialog.open();
-            if (value != null)
-            {
-                text.setText(value);
-            }
-        }
-        else
-        {
-            FileDialog dialog = new FileDialog(shell, SWT.NONE);
-            dialog.setText(msg);
-            String value = dialog.open();
-            if (value != null)
-            {
-                text.setText(value);
-            }
-        }
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IAccumulator.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IAccumulator.java
deleted file mode 100644
index daa5f15..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IAccumulator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.Collection;
-
-public interface IAccumulator<E>
-{
-    public void addElement(E element);
-
-    public void addElements(Collection<? extends E> elements);
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IElementDescriptor.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IElementDescriptor.java
deleted file mode 100644
index 57aadc9..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IElementDescriptor.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-public interface IElementDescriptor<E>
-{
-    /**
-     * Return the short identifying name of the element.
-     */
-    String getName(E element);
-
-    /**
-     * Return a label for the element, including the name but possibly supplying
-     * additional information.
-     * 
-     * @param element
-     * @return
-     */
-    String getLabel(E element);
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IExportToImportConverter.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IExportToImportConverter.java
deleted file mode 100644
index 1ddc6fe..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IExportToImportConverter.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-public interface IExportToImportConverter<E, I>
-{
-    I convert(E exportElement);
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IFilter.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IFilter.java
deleted file mode 100644
index 0d33c3a..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IFilter.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-public interface IFilter<T>
-{
-    boolean select(T element);
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IValidationListener.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IValidationListener.java
deleted file mode 100644
index e325c5e..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/IValidationListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-public interface IValidationListener
-{
-
-    void validationMessage(String message, int level);
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ModelLabelProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ModelLabelProvider.java
deleted file mode 100644
index 9dc0b37..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ModelLabelProvider.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.osgi.framework.Version;
-
-public class ModelLabelProvider extends LabelProvider
-{
-    private volatile Set<? extends IModelElement> unresolvedElements = null;
-
-    public Image getImage(Object element)
-    {
-        boolean unresolved = (unresolvedElements == null) ? false
-            : unresolvedElements.contains(element);
-
-        if (element instanceof ISigilBundle || element instanceof IBundleModelElement)
-        {
-            return findBundle();
-        }
-        else if (element instanceof IRequiredBundle)
-        {
-            boolean optional = ((IRequiredBundle) element).isOptional();
-            return findRequiredBundle(optional, unresolved);
-        }
-        else if (element instanceof IPackageImport)
-        {
-            boolean optional = ((IPackageImport) element).isOptional();
-            return findPackageImport(optional, unresolved);
-        }
-        else if (element instanceof IPackageExport)
-        {
-            return findPackageExport();
-        }
-        else if (element instanceof IPackageFragmentRoot)
-        {
-            IPackageFragmentRoot root = (IPackageFragmentRoot) element;
-            try
-            {
-                if (root.getKind() == IPackageFragmentRoot.K_SOURCE)
-                {
-                    return findPackage();
-                }
-                else
-                {
-                    return findBundle();
-                }
-            }
-            catch (JavaModelException e)
-            {
-                SigilCore.error("Failed to inspect package fragment root", e);
-            }
-        }
-        else if (element instanceof IClasspathEntry)
-        {
-            return findPackage();
-        }
-        else if (element instanceof IBundleRepository)
-        {
-            IBundleRepository rep = (IBundleRepository) element;
-            IRepositoryModel config = SigilCore.getRepositoryModel(rep);
-            return config.getType().getIcon();
-        }
-        else if (element instanceof Throwable) {
-            return PlatformUI.getWorkbench().getSharedImages().getImage(
-                ISharedImages.IMG_OBJS_ERROR_TSK);
-        }
-
-        return null;
-    }
-
-    public String getText(Object element)
-    {
-        if (element instanceof ISigilBundle)
-        {
-            ISigilBundle bundle = (ISigilBundle) element;
-            return bundle.getBundleInfo().getSymbolicName() + " "
-                + bundle.getBundleInfo().getVersion();
-        }
-        if (element instanceof IBundleModelElement)
-        {
-            IBundleModelElement bundle = (IBundleModelElement) element;
-            return bundle.getSymbolicName();
-        }
-        if (element instanceof IRequiredBundle)
-        {
-            IRequiredBundle req = (IRequiredBundle) element;
-            return req.getSymbolicName() + " " + req.getVersions();
-        }
-
-        if (element instanceof IPackageImport)
-        {
-            IPackageImport req = (IPackageImport) element;
-            return req.getPackageName() + " " + req.getVersions();
-        }
-
-        if (element instanceof IPackageExport)
-        {
-            IPackageExport pe = (IPackageExport) element;
-            Version rawVersion = pe.getRawVersion();
-            return rawVersion != null ? pe.getPackageName() + " " + rawVersion
-                : pe.getPackageName();
-        }
-
-        if (element instanceof IResource)
-        {
-            IResource resource = (IResource) element;
-            return resource.getName();
-        }
-
-        if (element instanceof IPackageFragment)
-        {
-            IPackageFragment f = (IPackageFragment) element;
-            return f.getElementName();
-        }
-
-        if (element instanceof IPackageFragmentRoot)
-        {
-            IPackageFragmentRoot f = (IPackageFragmentRoot) element;
-            try
-            {
-                return f.getUnderlyingResource().getName();
-            }
-            catch (JavaModelException e)
-            {
-                return "unknown";
-            }
-        }
-
-        if (element instanceof IClasspathEntry)
-        {
-            IClasspathEntry cp = (IClasspathEntry) element;
-            return cp.getPath().toString();
-        }
-
-        if (element instanceof IBundleRepository)
-        {
-            IBundleRepository rep = (IBundleRepository) element;
-            IRepositoryModel config = SigilCore.getRepositoryModel(rep);
-            return config.getName();
-        }
-        
-        if ( element instanceof Throwable ) {
-            Throwable t = (Throwable) element;
-            ByteArrayOutputStream buf = new ByteArrayOutputStream();
-            PrintStream print = new PrintStream(buf);
-            t.printStackTrace(print);
-            print.flush();
-            return buf.toString();
-        }
-
-        return element.toString();
-    }
-
-    private Image findPackage()
-    {
-        return cacheImage("icons/package.gif");
-    }
-
-    private Image findPackageImport(boolean optional, boolean unresolved)
-    {
-        String path;
-        if (optional)
-        {
-            path = unresolved ? "icons/import-package-optional-error.gif"
-                : "icons/import-package-optional.gif";
-        }
-        else
-        {
-            path = unresolved ? "icons/import-package-error.gif"
-                : "icons/import-package.gif";
-        }
-        return cacheImage(path);
-    }
-
-    private Image findPackageExport()
-    {
-        return cacheImage("icons/export-package.gif");
-    }
-
-    private Image findBundle()
-    {
-        return cacheImage("icons/bundle.gif");
-    }
-
-    private Image findRequiredBundle(boolean optional, boolean unresolved)
-    {
-        String path;
-        if (optional)
-        {
-            path = unresolved ? "icons/require-bundle-optional-error.gif"
-                : "icons/require-bundle-optional.gif";
-        }
-        else
-        {
-            path = unresolved ? "icons/require-bundle-error.gif"
-                : "icons/require-bundle.gif";
-        }
-        return cacheImage(path);
-    }
-
-    private static Image cacheImage(String path)
-    {
-        return SigilUI.cacheImage(path, ModelLabelProvider.class.getClassLoader());
-    }
-
-    public void setUnresolvedElements(Set<? extends IModelElement> elements)
-    {
-        this.unresolvedElements = elements;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/PackageFilter.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/PackageFilter.java
deleted file mode 100644
index 5aa3c03..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/PackageFilter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-
-public class PackageFilter implements IFilter<IPackageImport>
-{
-
-    private Set<String> names = new HashSet<String>();
-
-    public PackageFilter(String[] packageNames)
-    {
-        for (String name : packageNames)
-        {
-            names.add(name);
-        }
-    }
-
-    public PackageFilter(IPackageExport[] packages)
-    {
-        for (IPackageExport packageExport : packages)
-        {
-            names.add(packageExport.getPackageName());
-        }
-    }
-
-    public boolean select(IPackageImport element)
-    {
-        return !names.contains(element.getPackageName());
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ProjectUtils.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ProjectUtils.java
deleted file mode 100644
index 73ffa6c..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ProjectUtils.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.concurrent.Callable;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.ui.SigilUI;
-import org.apache.felix.sigil.eclipse.ui.internal.preferences.OptionalPrompt;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-public class ProjectUtils
-{
-    public static boolean runTaskWithRebuildCheck(final Runnable task, Shell shell)
-    {
-        return runTaskWithRebuildCheck(new Callable<Boolean>()
-        {
-            public Boolean call() throws Exception
-            {
-                task.run();
-                return true;
-            }
-        }, shell);
-    }
-
-    public static boolean runTaskWithRebuildCheck(Callable<Boolean> callable, Shell shell)
-    {
-        int result = checkRebuild(shell);
-        if (result == IDialogConstants.CANCEL_ID)
-        {
-            return false;
-        }
-        else
-        {
-            try
-            {
-                if (Boolean.TRUE == callable.call())
-                {
-                    if (result == IDialogConstants.YES_ID)
-                    {
-                        SigilUI.runWorkspaceOperation(new WorkspaceModifyOperation()
-                        {
-                            @Override
-                            protected void execute(IProgressMonitor monitor)
-                            {
-                                SigilCore.rebuildAllBundleDependencies(monitor);
-                            }
-                        }, shell);
-                    }
-                    return true;
-                }
-                else
-                {
-                    return false;
-                }
-            }
-            catch (Exception e)
-            {
-                SigilCore.error("Failed to run caller", e);
-                return false;
-            }
-        }
-    }
-
-    private static int checkRebuild(Shell shell)
-    {
-        if (SigilCore.getRoot().getProjects().isEmpty())
-        {
-            return IDialogConstants.NO_ID;
-        }
-        else
-        {
-            return OptionalPrompt.optionallyPromptWithCancel(
-                SigilCore.PREFERENCES_REBUILD_PROJECTS, "Rebuild",
-                "Do you wish to rebuild all Sigil projects", shell);
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ResourceReviewDialog.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ResourceReviewDialog.java
deleted file mode 100644
index acabd9a..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ResourceReviewDialog.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.sigil.eclipse.ui.util;
-
-import java.util.Collection;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-
-public class ResourceReviewDialog<T extends IModelElement> extends TitleAreaDialog
-{
-
-    private String title;
-    private Collection<T> resources;
-
-    private TableViewer viewer;
-
-    public ResourceReviewDialog(Shell parentShell, String title, Collection<T> resources)
-    {
-        super(parentShell);
-        this.title = title;
-        this.resources = resources;
-    }
-
-    public Collection<T> getResources()
-    {
-        return resources;
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent)
-    {
-        setTitle(title);
-
-        // Create controls
-        Composite container = (Composite) super.createDialogArea(parent);
-        Composite composite = new Composite(container, SWT.NONE);
-        Table table = new Table(composite, SWT.BORDER | SWT.VIRTUAL);
-
-        final Button remove = new Button(composite, SWT.PUSH);
-        remove.setText("Remove");
-        remove.setEnabled(false);
-
-        remove.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                handleRemove();
-            }
-        });
-
-        viewer = new TableViewer(table);
-        viewer.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return toArray(inputElement);
-            }
-        });
-
-        viewer.setInput(resources);
-        viewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                remove.setEnabled(!event.getSelection().isEmpty());
-            }
-        });
-
-        // layout
-        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        composite.setLayout(new GridLayout(2, false));
-        GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 4);
-        tableLayoutData.heightHint = 150;
-        table.setLayoutData(tableLayoutData);
-
-        return container;
-    }
-
-    private void handleRemove()
-    {
-        ISelection s = viewer.getSelection();
-        if (!s.isEmpty())
-        {
-            IStructuredSelection sel = (IStructuredSelection) s;
-            resources.remove(sel.getFirstElement());
-            viewer.refresh();
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ResourcesDialogHelper.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ResourcesDialogHelper.java
deleted file mode 100644
index 143803e..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ResourcesDialogHelper.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.ArrayList;
-
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.IModelWalker;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IPackageModelElement;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
-import org.apache.felix.sigil.eclipse.ui.internal.editors.project.NewPackageExportDialog;
-import org.apache.felix.sigil.eclipse.ui.internal.editors.project.NewResourceSelectionDialog;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeRoot;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.progress.IJobRunnable;
-
-public class ResourcesDialogHelper
-{
-
-    static final int UPDATE_BATCH_SIZE = 100;
-
-    public static BackgroundLoadingSelectionDialog<String> createClassSelectDialog(
-        Shell shell, String title, final ISigilProjectModel project, String selected,
-        final String ifaceOrParentClass)
-    {
-        final BackgroundLoadingSelectionDialog<String> dialog = new BackgroundLoadingSelectionDialog<String>(
-            shell, "Class Name", true);
-
-        IJobRunnable job = new IJobRunnable()
-        {
-            public IStatus run(IProgressMonitor monitor)
-            {
-                try
-                {
-                    for (IJavaElement e : JavaHelper.findTypes(project.getJavaModel(),
-                        IJavaElement.PACKAGE_FRAGMENT))
-                    {
-                        IPackageFragment root = (IPackageFragment) e;
-                        if (project.isInBundleClasspath(root))
-                        {
-                            for (IJavaElement e1 : JavaHelper.findTypes(root,
-                                IJavaElement.COMPILATION_UNIT, IJavaElement.CLASS_FILE))
-                            {
-                                ITypeRoot typeRoot = (ITypeRoot) e1;
-                                IType type = (IType) JavaHelper.findType(typeRoot,
-                                    IJavaElement.TYPE);
-                                if (JavaHelper.isAssignableTo(ifaceOrParentClass, type))
-                                {
-                                    dialog.addElement(type.getFullyQualifiedName());
-                                }
-                            }
-                        }
-                    }
-
-                    return Status.OK_STATUS;
-                }
-                catch (JavaModelException e)
-                {
-                    return e.getStatus();
-                }
-            }
-
-        };
-
-        dialog.addBackgroundJob("Scanning for activators in project", job);
-
-        return dialog;
-    }
-
-    public static NewResourceSelectionDialog<IPackageExport> createImportDialog(
-        Shell shell, String title, ISigilProjectModel sigil,
-        final IPackageImport selected, final Collection<IPackageImport> existing)
-    {
-        final Set<String> existingNames = new HashSet<String>();
-
-        for (IPackageImport existingImport : existing)
-        {
-            existingNames.add(existingImport.getPackageName());
-        }
-
-        final NewResourceSelectionDialog<IPackageExport> dialog = new NewResourceSelectionDialog<IPackageExport>(
-            shell, "Package Name:", false);
-
-        dialog.setFilter(new IFilter<IPackageModelElement>()
-        {
-            public boolean select(IPackageModelElement element)
-            {
-                return !existingNames.contains(element.getPackageName());
-            }
-        });
-
-        dialog.setComparator(new Comparator<IPackageExport>()
-        {
-            public int compare(IPackageExport o1, IPackageExport o2)
-            {
-                return o1.compareTo(o2);
-            }
-        });
-
-        dialog.setDescriptor(new IElementDescriptor<IPackageExport>()
-        {
-            public String getLabel(IPackageExport element)
-            {
-                return getName(element) + " (" + element.getVersion().toString() + ")";
-            }
-
-            public String getName(IPackageExport element)
-            {
-                return element.getPackageName();
-            }
-        });
-
-        dialog.setLabelProvider(new WrappedContentProposalLabelProvider<IPackageExport>(
-            dialog.getDescriptor()));
-
-        if (selected != null)
-        {
-            dialog.setSelectedName(selected.getPackageName());
-            dialog.setVersions(selected.getVersions());
-            dialog.setOptional(selected.isOptional());
-        }
-
-        IJobRunnable job = new ExportedPackageFinder(sigil, dialog);
-        dialog.addBackgroundJob("Scanning for exports in workspace", job);
-
-        return dialog;
-    }
-
-    public static NewPackageExportDialog createNewExportDialog(Shell shell, String title,
-        final IPackageExport selected, final ISigilProjectModel project,
-        boolean multiSelect)
-    {
-        IFilter<IJavaElement> selectFilter = new IFilter<IJavaElement>()
-        {
-            public boolean select(IJavaElement e)
-            {
-                if (selected != null
-                    && e.getElementName().equals(selected.getPackageName()))
-                {
-                    return true;
-                }
-
-                if (e.getElementName().trim().length() > 0 && isLocal(e))
-                {
-                    for (IPackageExport p : project.getBundle().getBundleInfo().getExports())
-                    {
-                        if (p.getPackageName().equals(e.getElementName()))
-                        {
-                            return false;
-                        }
-                    }
-
-                    return true;
-                }
-                else
-                {
-                    return false;
-                }
-            }
-
-            private boolean isLocal(IJavaElement java)
-            {
-                try
-                {
-                    switch (java.getElementType())
-                    {
-                        case IJavaElement.PACKAGE_FRAGMENT:
-                            IPackageFragment fragment = (IPackageFragment) java;
-                            return fragment.containsJavaResources();
-                        default:
-                            throw new IllegalStateException("Unexpected resource type "
-                                + java);
-                    }
-                }
-                catch (JavaModelException e)
-                {
-                    SigilCore.error("Failed to inspect java element ", e);
-                    return false;
-                }
-            }
-
-        };
-
-        final NewPackageExportDialog dialog = new NewPackageExportDialog(shell,
-            multiSelect);
-        dialog.setFilter(selectFilter);
-
-        dialog.setProjectVersion(project.getVersion());
-        if (selected != null)
-        {
-            dialog.setSelectedName(selected.getPackageName());
-            dialog.setVersion(selected.getRawVersion());
-        }
-
-        IJobRunnable job = new IJobRunnable()
-        {
-            public IStatus run(IProgressMonitor monitor)
-            {
-                try
-                {
-                    ArrayList<IPackageFragment> list = new ArrayList<IPackageFragment>(
-                        UPDATE_BATCH_SIZE);
-                    for (IJavaElement e : JavaHelper.findTypes(project.getJavaModel(),
-                        IJavaElement.PACKAGE_FRAGMENT))
-                    {
-                        IPackageFragment root = (IPackageFragment) e;
-                        if (project.isInBundleClasspath(root))
-                        {
-                            list.add(root);
-                            if (list.size() >= UPDATE_BATCH_SIZE)
-                            {
-                                dialog.addElements(list);
-                                list.clear();
-                            }
-                        }
-                    }
-                    if (!list.isEmpty())
-                    {
-                        dialog.addElements(list);
-                    }
-                    return Status.OK_STATUS;
-                }
-                catch (JavaModelException e)
-                {
-                    return e.getStatus();
-                }
-            }
-        };
-
-        dialog.addBackgroundJob("Scanning for packages in project", job);
-
-        return dialog;
-    }
-
-    public static NewResourceSelectionDialog<IBundleModelElement> createRequiredBundleDialog(
-        Shell shell, String title, final ISigilProjectModel sigil,
-        final IRequiredBundle selected, final Collection<IRequiredBundle> existing)
-    {
-        final Set<String> existingNames = new HashSet<String>();
-        for (IRequiredBundle existingBundle : existing)
-        {
-            existingNames.add(existingBundle.getSymbolicName());
-        }
-
-        final NewResourceSelectionDialog<IBundleModelElement> dialog = new NewResourceSelectionDialog<IBundleModelElement>(
-            shell, "Bundle:", false);
-
-        dialog.setDescriptor(new IElementDescriptor<IBundleModelElement>()
-        {
-            public String getLabel(IBundleModelElement element)
-            {
-                return getName(element) + " (" + element.getVersion() + ")";
-            }
-
-            public String getName(IBundleModelElement element)
-            {
-                return element.getSymbolicName();
-            }
-        });
-
-        dialog.setLabelProvider(new WrappedContentProposalLabelProvider<IBundleModelElement>(
-            dialog.getDescriptor()));
-
-        dialog.setFilter(new IFilter<IBundleModelElement>()
-        {
-            public boolean select(IBundleModelElement element)
-            {
-                return !existingNames.contains(element.getSymbolicName());
-            }
-        });
-
-        dialog.setComparator(new Comparator<IBundleModelElement>()
-        {
-            public int compare(IBundleModelElement o1, IBundleModelElement o2)
-            {
-                return o1.getSymbolicName().compareTo(o2.getSymbolicName());
-            }
-        });
-
-        if (selected != null)
-        {
-            dialog.setSelectedName(selected.getSymbolicName());
-            dialog.setVersions(selected.getVersions());
-            dialog.setOptional(selected.isOptional());
-        }
-
-        IJobRunnable job = new IJobRunnable()
-        {
-            public IStatus run(final IProgressMonitor monitor)
-            {
-                final List<IBundleModelElement> bundles = new ArrayList<IBundleModelElement>(
-                    UPDATE_BATCH_SIZE);
-                final IModelWalker walker = new IModelWalker()
-                {
-                    //int count = 0;
-                    public boolean visit(IModelElement element)
-                    {
-                        if (element instanceof IBundleModelElement)
-                        {
-                            IBundleModelElement b = (IBundleModelElement) element;
-                            bundles.add(b);
-
-                            if (bundles.size() >= UPDATE_BATCH_SIZE)
-                            {
-                                dialog.addElements(bundles);
-                                bundles.clear();
-                            }
-                            // no need to recurse further.
-                            return false;
-                        }
-                        return !monitor.isCanceled();
-                    }
-                };
-                sigil.getRepositoryManager().visit(walker);
-                if (!bundles.isEmpty())
-                {
-                    dialog.addElements(bundles);
-                }
-                return Status.OK_STATUS;
-            }
-        };
-
-        dialog.addBackgroundJob("Scanning for bundles in workspace", job);
-
-        return dialog;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/SelectionDialog.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/SelectionDialog.java
deleted file mode 100644
index 13a26a7..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/SelectionDialog.java
+++ /dev/null
@@ -1,555 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.fieldassist.ContentProposalAdapter;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.fieldassist.IContentProposal;
-import org.eclipse.jface.fieldassist.IContentProposalListener;
-import org.eclipse.jface.fieldassist.TextContentAdapter;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IOpenListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.OpenEvent;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author dave
- *
- * @param <E>
- */
-public class SelectionDialog<E> extends TitleAreaDialog
-{
-
-    private final ILabelProvider DEFAULT_LABEL_PROVIDER = new LabelProvider()
-        {
-            @SuppressWarnings("unchecked")
-            public String getText(Object element)
-            {
-                String result;
-                if (element instanceof WrappedContentProposal<?>)
-                {
-                    WrappedContentProposal<E> contentProposal = (org.apache.felix.sigil.eclipse.ui.util.WrappedContentProposal<E>) element;
-                    result = contentProposal.getLabel();
-                }
-                else
-                {
-                    result = descriptor.getLabel((E) element);
-                }
-                return result;
-            }
-        };
-    private final IElementDescriptor<E> DEFAULT_DESCRIPTOR = new IElementDescriptor<E>()
-        {
-            public String getLabel(E element)
-            {
-                return getName(element);
-            }
-    
-            public String getName(E element)
-            {
-                return element == null ? "null" : element.toString();
-            }
-        };
-    protected final String selectionLabel;
-    private IFilter<? super E> filter;
-    private IElementDescriptor<? super E> descriptor = DEFAULT_DESCRIPTOR;
-    private ILabelProvider labelProvider = DEFAULT_LABEL_PROVIDER;
-    protected final boolean multi;
-    protected final List<E> elements;
-    private List<E> selection = null;
-    private String selectedName = null;
-    private TableViewer viewer = null;
-    private Comparator<? super E> comparator;
-
-    private static final void onUIThread(Control control, Runnable r)
-    {
-        if (control != null && !control.isDisposed())
-        {
-            try
-            {
-                Display display = control.getDisplay();
-                if (Thread.currentThread() == display.getThread())
-                {
-                    // We are on the UI thread already, just do the work
-                    r.run();
-                }
-                else
-                {
-                    // Not on the UI thread, need to bung over the runnable
-                    display.asyncExec(r);
-                }
-            }
-            catch (SWTError e)
-            {
-                if (e.code == SWT.ERROR_WIDGET_DISPOSED)
-                {
-                    // ignore
-                }
-                else
-                {
-                    throw e;
-                }
-            }
-        }
-    }
-
-    public void setFilter(IFilter<? super E> filter)
-    {
-        this.filter = filter;
-    }
-
-    public void setDescriptor(final IElementDescriptor<? super E> descriptor)
-    {
-        if (descriptor != null)
-        {
-            this.descriptor = descriptor;
-        }
-        else
-        {
-            this.descriptor = DEFAULT_DESCRIPTOR;
-        }
-    }
-
-    public IElementDescriptor<? super E> getDescriptor()
-    {
-        return descriptor;
-    }
-
-    public void setComparator(Comparator<? super E> comparator)
-    {
-        this.comparator = comparator;
-    }
-
-    public void setLabelProvider(ILabelProvider labelProvider)
-    {
-        if (labelProvider != null)
-        {
-            this.labelProvider = labelProvider;
-        }
-        else
-        {
-            this.labelProvider = DEFAULT_LABEL_PROVIDER;
-        }
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent)
-    {
-        // Create Controls
-        Composite container = (Composite) super.createDialogArea(parent);
-        Composite composite = new Composite(container, SWT.NONE);
-    
-        new Label(composite, SWT.NONE).setText(selectionLabel);
-    
-        ContentProposalAdapter proposalAdapter = null;
-        Text txtSelection = null;
-    
-        Table table = null;
-        if (multi)
-        {
-            table = new Table(composite, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
-            viewer = new TableViewer(table);
-            viewer.setContentProvider(new ArrayContentProvider());
-            viewer.addFilter(new ViewerFilter()
-            {
-                public boolean select(Viewer viewer, Object parentElement, Object element)
-                {
-                    @SuppressWarnings("unchecked")
-                    E castedElement = (E) element;
-                    return filter == null || filter.select(castedElement);
-                }
-            });
-            if (comparator != null)
-            {
-                viewer.setSorter(new ViewerSorter()
-                {
-                    @Override
-                    public int compare(Viewer viewer, Object o1, Object o2)
-                    {
-                        @SuppressWarnings("unchecked")
-                        E e1 = (E) o1;
-                        @SuppressWarnings("unchecked")
-                        E e2 = (E) o2;
-                        return comparator.compare(e1, e2);
-                    }
-                });
-            }
-            synchronized (elements)
-            {
-                viewer.setInput(elements);
-            }
-    
-            if (labelProvider != null)
-            {
-                viewer.setLabelProvider(labelProvider);
-            }
-        }
-        else
-        {
-            txtSelection = new Text(composite, SWT.BORDER);
-            ControlDecoration selectionDecor = new ControlDecoration(txtSelection,
-                SWT.LEFT | SWT.TOP);
-            FieldDecoration proposalDecor = FieldDecorationRegistry.getDefault().getFieldDecoration(
-                FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
-            selectionDecor.setImage(proposalDecor.getImage());
-            selectionDecor.setDescriptionText(proposalDecor.getDescription());
-    
-            ExclusionContentProposalProvider<E> proposalProvider = new ExclusionContentProposalProvider<E>(
-                elements, filter, descriptor);
-    
-            proposalAdapter = new ContentProposalAdapter(txtSelection,
-                new TextContentAdapter(), proposalProvider, null, null);
-            proposalAdapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
-            if (labelProvider != null)
-            {
-                proposalAdapter.setLabelProvider(labelProvider);
-            }
-    
-            if (selectedName != null)
-            {
-                txtSelection.setText(selectedName);
-            }
-        }
-        updateSelection();
-        updateButtons();
-    
-        // Hookup listeners
-        if (proposalAdapter != null)
-        {
-            proposalAdapter.addContentProposalListener(new IContentProposalListener()
-            {
-                public void proposalAccepted(IContentProposal proposal)
-                {
-                    @SuppressWarnings("unchecked")
-                    WrappedContentProposal<E> valueProposal = (org.apache.felix.sigil.eclipse.ui.util.WrappedContentProposal<E>) proposal;
-                    E selected = valueProposal.getElement();
-                    selection = new ArrayList<E>(1);
-                    selection.add(selected);
-    
-                    elementSelected(selected);
-    
-                    updateButtons();
-                }
-            });
-        }
-        if (txtSelection != null)
-        {
-            txtSelection.addModifyListener(new ModifyListener()
-            {
-                public void modifyText(ModifyEvent e)
-                {
-                    selectedName = ((Text) e.widget).getText();
-                    updateButtons();
-                }
-            });
-        }
-        if (viewer != null)
-        {
-            viewer.addSelectionChangedListener(new ISelectionChangedListener()
-            {
-                public void selectionChanged(SelectionChangedEvent event)
-                {
-                    IStructuredSelection sel = (IStructuredSelection) event.getSelection();
-                    selection = new ArrayList<E>(sel.size());
-                    for (Iterator<?> iter = sel.iterator(); iter.hasNext();)
-                    {
-                        @SuppressWarnings("unchecked")
-                        E element = (E) iter.next();
-                        selection.add(element);
-                    }
-                    updateButtons();
-                }
-            });
-            viewer.addOpenListener(new IOpenListener()
-            {
-                public void open(OpenEvent event)
-                {
-                    if (canComplete())
-                    {
-                        setReturnCode(IDialogConstants.OK_ID);
-                        close();
-                    }
-                }
-            });
-        }
-    
-        // Layout
-        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        if (multi)
-        {
-            composite.setLayout(new GridLayout(1, false));
-            GridData layoutTable = new GridData(SWT.FILL, SWT.FILL, true, true);
-            layoutTable.heightHint = 200;
-            table.setLayoutData(layoutTable);
-        }
-        else
-        {
-            composite.setLayout(new GridLayout(2, false));
-            txtSelection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        }
-    
-        return container;
-    }
-
-    protected void elementSelected(E selection)
-    {
-    }
-
-    @Override
-    protected Control createButtonBar(Composite parent)
-    {
-        Control bar = super.createButtonBar(parent);
-        updateButtons();
-        return bar;
-    }
-
-    /**
-     * Can be called from any thread
-     */
-    protected final void updateButtons()
-    {
-        Runnable updateButtonsRunnable = new Runnable()
-        {
-            public void run()
-            {
-                Shell shell = getShell();
-                if (shell != null && !shell.isDisposed())
-                {
-                    Button okButton = getButton(IDialogConstants.OK_ID);
-                    if (okButton != null && !okButton.isDisposed())
-                    {
-                        okButton.setEnabled(canComplete());
-                    }
-                }
-            }
-        };
-        Shell shell = getShell();
-        if (shell != null)
-        {
-            onUIThread(shell, updateButtonsRunnable);
-        }
-    }
-
-    /**
-     * Subclasses may override but must call super.canComplete
-     * @return
-     */
-    protected synchronized boolean canComplete()
-    {
-        boolean result = false;
-    
-        if (selection != null)
-        {
-            if (multi)
-            {
-                result = selection.size() > 0;
-            }
-            else
-            {
-                E sel = getSelectedElement();
-                result = sel != null && descriptor.getName(sel).equals(selectedName);
-            }
-        }
-    
-        return result;
-    }
-
-    public final void addElement(E added)
-    {
-        addElements(Collections.singleton(added));
-    }
-
-    /**
-     * Can be called from any thread
-     */
-    public final void addElements(Collection<? extends E> added)
-    {
-        final LinkedList<E> toAdd = new LinkedList<E>();
-        synchronized (elements)
-        {
-            for (E e : added)
-            {
-                if (!elements.contains(e))
-                {
-                    elements.add(e);
-                    toAdd.add(e);
-                }
-            }
-            Collections.sort(elements, comparator);
-        }
-        if (viewer != null)
-        {
-            onUIThread(viewer.getControl(), new Runnable()
-            {
-                public void run()
-                {
-                    if (!viewer.getControl().isDisposed())
-                    {
-                        viewer.add(toAdd.toArray());
-                        viewer.refresh();
-                    }
-                }
-            });
-        }
-        else
-        {
-    
-        }
-        updateSelection();
-        updateButtons();
-    }
-
-    protected void updateSelection()
-    {
-        onUIThread(getShell(), new Runnable()
-        {
-            public void run()
-            {
-                if (selectedName != null)
-                {
-                    ArrayList<E> newSelection = new ArrayList<E>();
-                    synchronized (elements)
-                    {
-                        for (E e : elements)
-                        {
-                            if (selectedName.equals(descriptor.getName(e)))
-                            {
-                                newSelection.add(e);
-                                break;
-                            }
-                        }
-                    }
-                    selection = newSelection;
-                }
-                else
-                {
-                    selection = Collections.emptyList();
-                }
-                if (viewer != null && !viewer.getControl().isDisposed())
-                {
-                    viewer.setSelection(selection.isEmpty() ? StructuredSelection.EMPTY
-                        : new StructuredSelection(selection));
-                }
-            }
-        });
-    }
-
-    /**
-     * @param parentShell
-     */
-    public SelectionDialog(Shell parentShell, String selectionLabel, boolean multi)
-    {
-        super(parentShell);
-        this.selectionLabel = selectionLabel;
-        this.multi = multi;
-        this.elements = new ArrayList<E>();
-    }
-
-    public String getSelectedName()
-    {
-        return selectedName;
-    }
-
-    public void setSelectedName(String selectedName)
-    {
-        this.selectedName = selectedName;
-        boolean change = false;
-        if (selectedName == null)
-        {
-            if (selection != null && !selection.isEmpty())
-            {
-                change = true;
-            }
-        }
-        else
-        {
-            if (selection == null)
-            {
-                change = true;
-            }
-            else if (selection.size() != 1
-                || !descriptor.getLabel(selection.get(0)).equals(selectedName))
-            {
-                change = true;
-            }
-        }
-    
-        if (change)
-        {
-            updateSelection();
-            updateButtons();
-        }
-    }
-
-    public List<E> getSelectedElements()
-    {
-        return selection;
-    }
-
-    public E getSelectedElement()
-    {
-        E result;
-        if (selection == null || selection.isEmpty())
-        {
-            result = null;
-        }
-        else
-        {
-            result = selection.get(0);
-        }
-        return result;
-    }
-
-}
\ No newline at end of file
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/SingletonSelection.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/SingletonSelection.java
deleted file mode 100644
index 2784d35..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/SingletonSelection.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-@SuppressWarnings("unchecked")
-public class SingletonSelection implements IStructuredSelection
-{
-
-    private final Object singleton;
-
-    public SingletonSelection(Object singleton)
-    {
-        this.singleton = singleton;
-    }
-
-    public Object getFirstElement()
-    {
-        return singleton;
-    }
-
-    public Iterator iterator()
-    {
-        return Collections.singleton(singleton).iterator();
-    }
-
-    public int size()
-    {
-        return 1;
-    }
-
-    public Object[] toArray()
-    {
-        return new Object[] { singleton };
-    }
-
-    public List toList()
-    {
-        ArrayList list = new ArrayList(1);
-        list.add(singleton);
-        return list;
-    }
-
-    public boolean isEmpty()
-    {
-        return false;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/UIHelper.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/UIHelper.java
deleted file mode 100644
index 347a6b7..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/UIHelper.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.felix.sigil.eclipse.ui.util;
-
-public class UIHelper
-{
-    public static <T> IElementDescriptor<T> getDefaultElementDescriptor()
-    {
-        return new IElementDescriptor<T>()
-        {
-            public String getLabel(T element)
-            {
-                return element == null ? "null" : element.toString();
-            }
-
-            public String getName(T element)
-            {
-                return getLabel(element);
-            }
-        };
-    }
-
-    public static <T> IFilter<T> getDefaultFilter()
-    {
-        return new IFilter<T>()
-        {
-            public boolean select(T element)
-            {
-                return true;
-            }
-        };
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/WrappedContentProposal.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/WrappedContentProposal.java
deleted file mode 100644
index ec44762..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/WrappedContentProposal.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import org.eclipse.jface.fieldassist.IContentProposal;
-
-public class WrappedContentProposal<T> implements IContentProposal
-{
-
-    private final T element;
-    private final IElementDescriptor<? super T> descriptor;
-
-    private WrappedContentProposal(T element, IElementDescriptor<? super T> descriptor)
-    {
-        this.element = element;
-        this.descriptor = descriptor;
-    }
-
-    public static <T> WrappedContentProposal<T> newInstance(T element,
-        IElementDescriptor<? super T> descriptor)
-    {
-        return new WrappedContentProposal<T>(element, descriptor);
-    }
-
-    public String getContent()
-    {
-        return descriptor.getName(element);
-    }
-
-    public int getCursorPosition()
-    {
-        return 0;
-    }
-
-    public String getDescription()
-    {
-        return null;
-    }
-
-    public String getLabel()
-    {
-        return descriptor.getLabel(element);
-    }
-
-    public T getElement()
-    {
-        return element;
-    }
-
-    @Override
-    public String toString()
-    {
-        return getLabel();
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/WrappedContentProposalLabelProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/WrappedContentProposalLabelProvider.java
deleted file mode 100644
index 9e1d46f..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/WrappedContentProposalLabelProvider.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.util;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-public class WrappedContentProposalLabelProvider<E> extends LabelProvider
-{
-
-    private final IElementDescriptor<? super E> descriptor;
-    private final ModelLabelProvider projectLabelProvider;
-
-    public WrappedContentProposalLabelProvider(IElementDescriptor<? super E> descriptor)
-    {
-        this.descriptor = descriptor;
-        projectLabelProvider = new ModelLabelProvider();
-    }
-
-    @SuppressWarnings("unchecked")
-    private E adapt(Object element)
-    {
-        E result;
-        if (element instanceof WrappedContentProposal<?>)
-        {
-            WrappedContentProposal<?> proposal = (org.apache.felix.sigil.eclipse.ui.util.WrappedContentProposal<?>) element;
-            result = (E) proposal.getElement();
-        }
-        else
-        {
-            result = (E) element;
-        }
-        return result;
-    }
-
-    @Override
-    public Image getImage(Object element)
-    {
-        Object value = adapt(element);
-        return projectLabelProvider.getImage(value);
-    }
-
-    @Override
-    public String getText(Object element)
-    {
-        return descriptor.getLabel(adapt(element));
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/project/SigilProjectWizard.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/project/SigilProjectWizard.java
deleted file mode 100644
index 982341f..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/project/SigilProjectWizard.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.wizard.project;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.ui.internal.wizard.SigilNewResourceWizard;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
-
-/**
- * @author dave
- *
- */
-public class SigilProjectWizard extends SigilNewResourceWizard implements IExecutableExtension
-{
-
-    private SigilProjectWizardFirstPage firstPage;
-    private SigilProjectWizardSecondPage secondPage;
-
-    private String name;
-
-    public static final IPath SIGIL_PROJECT_PATH = new Path(SigilCore.SIGIL_PROJECT_FILE);
-    private IConfigurationElement config;
-
-    public void init(IWorkbench workbench, IStructuredSelection currentSelection)
-    {
-        super.init(workbench, currentSelection);
-
-        firstPage = new SigilProjectWizardFirstPage();
-        firstPage.setInitialProjectName(name);
-        secondPage = new SigilProjectWizardSecondPage(firstPage);
-
-        addPage(firstPage);
-        addPage(secondPage);
-    }
-
-    private void finishPage(IProgressMonitor monitor) throws CoreException,
-        InterruptedException
-    {
-        secondPage.performFinish(monitor);
-
-        IProject newProject = firstPage.getProjectHandle();
-
-        if (newProject != null && newProject.exists())
-        {
-            IFile file = newProject.getFile(SigilProjectWizard.SIGIL_PROJECT_PATH);
-
-            selectRevealAndShow(file);
-
-            // don't do this check for now - see FELIX-1924
-            //            new Job( "Check OSGi Install" )
-            //            {
-            //                @Override
-            //                protected IStatus run( IProgressMonitor monitor )
-            //                {
-            //                    // prompt for osgi home if not already set.
-            //                    SigilCore.getInstallManager().getDefaultInstall();
-            //                    return Status.OK_STATUS;
-            //                }
-            //            }.schedule();
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.wizard.Wizard#performFinish()
-     */
-    @Override
-    public boolean performFinish()
-    {
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-        IWorkspaceRunnable op = new IWorkspaceRunnable()
-        {
-            public void run(IProgressMonitor monitor) throws CoreException
-            {
-                try
-                {
-                    finishPage(monitor);
-                }
-                catch (InterruptedException e)
-                {
-                    throw new OperationCanceledException(e.getMessage());
-                }
-            }
-        };
-
-        try
-        {
-            workspace.run(op, Job.getJobManager().createProgressGroup());
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to complete project wizard", e);
-            return false;
-        }
-
-        BasicNewProjectResourceWizard.updatePerspective(config);
-        return true;
-    }
-
-    public void setName(String name)
-    {
-        this.name = name;
-    }
-
-    public String getName()
-    {
-        return name;
-    }
-
-    @Override
-    public boolean performCancel()
-    {
-        secondPage.performCancel();
-        return super.performCancel();
-    }
-
-    public void setInitializationData(IConfigurationElement config, String propertyName,
-        Object data) throws CoreException
-    {
-        this.config = config;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/project/SigilProjectWizardFirstPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/project/SigilProjectWizardFirstPage.java
deleted file mode 100644
index c11ce93..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/project/SigilProjectWizardFirstPage.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.wizard.project;
-
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
-import org.osgi.framework.Version;
-
-/**
- * @author dave
- *
- */
-public class SigilProjectWizardFirstPage extends WizardNewProjectCreationPage
-{
-
-    private volatile String bsn;
-    private volatile String description;
-    private volatile Version version;
-    private volatile String vendor;
-    private volatile String name;
-
-    private Button customBSN;
-    private Text txtBSN;
-    private Text txtDescription;
-    private Text txtVersion;
-    private Text txtVendor;
-    private Text txtName;
-    private boolean initialized;
-
-    public SigilProjectWizardFirstPage()
-    {
-        super("newSigilProjectPage");
-        setTitle("Sigil Project");
-        setDescription("Create a new Sigil project");
-        setImageDescriptor(ImageDescriptor.createFromFile(
-            SigilProjectWizardFirstPage.class, "/icons/logo64x64.gif"));
-    }
-
-    public boolean isInWorkspace()
-    {
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-        IPath defaultDefaultLocation = workspace.getRoot().getLocation();
-
-        return defaultDefaultLocation.isPrefixOf(getLocationPath());
-    }
-
-    @Override
-    public boolean isPageComplete()
-    {
-        boolean result = super.isPageComplete();
-        return result;
-    }
-
-    @Override
-    public void createControl(Composite parent)
-    {
-        // Create controls
-        super.createControl(parent);
-        Composite control = (Composite) getControl();
-
-        Group grpProjectSettings = buildComponents(control);
-        setDefaultValues();
-        initListeners();
-        doLayout(control, grpProjectSettings);
-        initialized = true;
-    }
-
-    private Group buildComponents(Composite control)
-    {
-        Group grpProjectSettings = new Group(control, SWT.NONE);
-        grpProjectSettings.setText("OSGi Bundle Settings");
-
-        new Label(grpProjectSettings, SWT.NONE).setText("Symbolic Name:");
-        txtBSN = new Text(grpProjectSettings, SWT.BORDER);
-        txtBSN.setEnabled(false);
-        customBSN = new Button(grpProjectSettings, SWT.CHECK | SWT.RIGHT);
-        customBSN.setText("Custom");
-
-        new Label(grpProjectSettings, SWT.NONE).setText("Version:");
-        txtVersion = new Text(grpProjectSettings, SWT.BORDER);
-
-        new Label(grpProjectSettings, SWT.NONE).setText("Name:");
-        txtName = new Text(grpProjectSettings, SWT.BORDER);
-
-        new Label(grpProjectSettings, SWT.NONE).setText("Description:");
-        txtDescription = new Text(grpProjectSettings, SWT.BORDER);
-
-        new Label(grpProjectSettings, SWT.NONE).setText("Provider:");
-        txtVendor = new Text(grpProjectSettings, SWT.BORDER);
-
-        decorateComponents();
-        
-        return grpProjectSettings;
-    }
-
-    /**
-     * 
-     */
-    private void decorateComponents()
-    {
-        FieldDecoration infoDecor = FieldDecorationRegistry.getDefault().getFieldDecoration(
-            FieldDecorationRegistry.DEC_INFORMATION);
-
-        ControlDecoration txtBSNDecor = new ControlDecoration(txtBSN, SWT.LEFT
-            | SWT.CENTER);
-        txtBSNDecor.setImage(infoDecor.getImage());
-        txtBSNDecor.setDescriptionText("The unique name of this bundle - should follow reverse domain name pattern");
-        
-        ControlDecoration txtVersionDecor = new ControlDecoration(txtVersion, SWT.LEFT
-            | SWT.CENTER);
-        txtVersionDecor.setImage(infoDecor.getImage());
-        txtVersionDecor.setDescriptionText("The version of this bundle");
-        
-        ControlDecoration txtNameDecor = new ControlDecoration(txtName, SWT.LEFT
-            | SWT.CENTER);
-        txtNameDecor.setImage(infoDecor.getImage());
-        txtNameDecor.setDescriptionText("Defines a human-readable name for the bundle");
-
-        ControlDecoration txtDescDecor = new ControlDecoration(txtDescription, SWT.LEFT
-            | SWT.CENTER);
-        txtDescDecor.setImage(infoDecor.getImage());
-        txtDescDecor.setDescriptionText("Defines a short human-readable description for the bundle");
-
-        ControlDecoration txtVendorDecor = new ControlDecoration(txtVendor, SWT.LEFT
-            | SWT.CENTER);
-        txtVendorDecor.setImage(infoDecor.getImage());
-        txtVendorDecor.setDescriptionText("The name of the company, organisation or individual providing the bundle");
-    }
-
-    private void setDefaultValues()
-    {
-        version = VersionTable.getVersion(1, 0, 0);
-        txtVersion.setText(version.toString());
-    }
-
-    private void initListeners()
-    {
-        // Add listeners
-        ModifyListener txtModListener = new ModifyListener()
-        {
-            public void modifyText(ModifyEvent e)
-            {
-                validatePage();
-            }
-        };
-
-        customBSN.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                txtBSN.setEnabled(customBSN.getSelection());
-                validatePage();
-            }
-        });
-        
-        txtBSN.addModifyListener(txtModListener);
-        txtDescription.addModifyListener(txtModListener);
-        txtVersion.addModifyListener(txtModListener);
-        txtVendor.addModifyListener(txtModListener);
-        txtName.addModifyListener(txtModListener);
-    }
-
-    private void doLayout(Composite control, Group grpProjectSettings)
-    {
-        control.setLayout(new GridLayout());
-        grpProjectSettings.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        grpProjectSettings.setLayout(new GridLayout(3, false));
-        txtBSN.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        customBSN.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, false));
-        txtDescription.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
-        txtVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
-        txtVendor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
-        txtName.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
-    }
-
-    @Override
-    protected boolean validatePage()
-    {
-        readValues();
-        if ( super.validatePage() ) {
-            if (getBundleSymbolicName() == null)
-            {
-                setErrorMessage("Invalid bundle symbolic name");
-                setPageComplete(false);
-                return false;
-            }
-    
-            if (getVersion() == null)
-            {
-                setErrorMessage("Invalid version");
-                setPageComplete(false);
-                return false;
-            }
-    
-            // ok all must be fine...
-            setErrorMessage(null);
-            setPageComplete(true);
-        }
-        
-        return true;
-    }
-
-    private static final ThreadLocal<Object> reentrant = new ThreadLocal<Object>();
-    private static final Object REENTRANCE = new Object();
-    
-    /**
-     * 
-     */
-    private void readValues()
-    {
-        if ( initialized && reentrant.get() != REENTRANCE ) {
-            if ( customBSN.getSelection() ) {
-                bsn = nullIfEmpty(txtBSN.getText());
-            }
-            else {
-                bsn = getProjectName();
-                reentrant.set(REENTRANCE);
-                txtBSN.setText(bsn);
-                reentrant.set(null);
-            }
-            
-            description = nullIfEmpty(txtDescription.getText());
-            name = nullIfEmpty(txtName.getText());
-            vendor = nullIfEmpty(txtVendor.getText());
-            version = nullIfInvalidVersion(txtVersion.getText());
-        }
-    }
-
-    public Version getVersion()
-    {
-        return version;
-    }
-
-    public String getVendor()
-    {
-        return vendor;
-    }
-
-    public String getDescription()
-    {
-        return description;
-    }
-
-    public String getBundleSymbolicName()
-    {
-        return bsn;
-    }
-
-    public String getName()
-    {
-        return name;
-    }
-
-    // utility methods
-    private static String nullIfEmpty(String str)
-    {
-        return str == null ? null : (str.trim().length() == 0 ? null : str.trim());
-    }
-
-    private static Version nullIfInvalidVersion(String text)
-    {
-        Version version = null;
-        try
-        {
-            String v = nullIfEmpty(text);
-            if (v != null)
-            {
-                version = VersionTable.getVersion(v);
-            }
-        }
-        catch (IllegalArgumentException e)
-        {
-            // fine version is invalid - handled by validateSettings
-        }
-
-        return version;
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/project/SigilProjectWizardSecondPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/project/SigilProjectWizardSecondPage.java
deleted file mode 100644
index e451213..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/project/SigilProjectWizardSecondPage.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.wizard.project;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.wizards.JavaCapabilityConfigurationPage;
-import org.osgi.framework.Version;
-
-/**
- * @author dave
- *
- */
-public class SigilProjectWizardSecondPage extends JavaCapabilityConfigurationPage
-{
-
-    private SigilProjectWizardFirstPage firstPage;
-    private IProject currentProject;
-    private URI currentProjectLocation;
-    private boolean created;
-
-    public SigilProjectWizardSecondPage(SigilProjectWizardFirstPage firstPage)
-    {
-        this.firstPage = firstPage;
-    }
-
-    @Override
-    public void setVisible(boolean visible)
-    {
-        super.setVisible(visible);
-        if (visible)
-        {
-            changeToNewProject();
-        }
-        else
-        {
-            removeProject();
-        }
-    }
-
-    @Override
-    protected boolean useNewSourcePage()
-    {
-        return true;
-    }
-
-    protected void performFinish(IProgressMonitor monitor) throws CoreException,
-        InterruptedException
-    {
-        boolean updated = changeToNewProject();
-        if (!updated)
-        {
-            updateProject(monitor);
-        }
-    }
-
-    private boolean changeToNewProject()
-    {
-        boolean updated = false;
-        if (!created)
-        {
-            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-            IWorkspaceRunnable op = new IWorkspaceRunnable()
-            {
-                public void run(IProgressMonitor monitor) throws CoreException
-                {
-                    try
-                    {
-                        updateProject(monitor);
-                    }
-                    catch (InterruptedException e)
-                    {
-                        throw new OperationCanceledException(e.getMessage());
-                    }
-                }
-            };
-
-            try
-            {
-                workspace.run(op, workspace.getRoot(), IWorkspace.AVOID_UPDATE,
-                    Job.getJobManager().createProgressGroup());
-                setErrorMessage(null);
-                setPageComplete(true);
-                created = true;
-                updated = true;
-            }
-            catch (CoreException e)
-            {
-                SigilCore.error("Failed to run workspace job", e);
-            }
-        }
-
-        return updated;
-    }
-
-    private void removeProject()
-    {
-        if (currentProject == null || !currentProject.exists())
-        {
-            return;
-        }
-
-        IWorkspaceRunnable op = new IWorkspaceRunnable()
-        {
-            public void run(IProgressMonitor monitor) throws CoreException
-            {
-                doRemoveProject(monitor);
-            }
-        };
-
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-        try
-        {
-            workspace.run(op, Job.getJobManager().createProgressGroup());
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to run workspace job", e);
-        }
-        finally
-        {
-            created = false;
-        }
-    }
-
-    private void updateProject(IProgressMonitor monitor) throws CoreException,
-        InterruptedException
-    {
-        currentProject = firstPage.getProjectHandle();
-        currentProjectLocation = getProjectLocationURI();
-
-        String bsn = firstPage.getBundleSymbolicName();
-        String description = firstPage.getDescription();
-        Version projectVersion = firstPage.getVersion();
-        String vendor = firstPage.getVendor();
-        String name = firstPage.getName();
-
-        createProject(currentProject, currentProjectLocation, monitor);
-
-        IPath src = createSourcePath();
-
-        IPath output = getOutputLocation();
-
-        if (output.segmentCount() == 0)
-        {
-            output = new Path(currentProject.getName()).append("build").append("classes");
-        }
-
-        IClasspathEntry[] entries = getProjectClassPath(src);
-
-        SigilCore.makeSigilProject(currentProject, monitor);
-
-        init(JavaCore.create(currentProject), output.makeRelative(), entries, false);
-
-        configureJavaProject(new SubProgressMonitor(monitor, 3));
-
-        configureSigilProject(currentProject, bsn, description, projectVersion, vendor,
-            name, src, monitor);
-    }
-
-    private IPath createSourcePath() throws CoreException
-    {
-        IPath projectPath = currentProject.getFullPath();
-        IPath src = new Path("src");
-        IFolder f = currentProject.getFolder(src);
-        if (!f.getLocation().toFile().exists())
-        {
-            f.create(true, true, null);
-        }
-
-        return projectPath.append(src);
-    }
-
-    final void doRemoveProject(IProgressMonitor monitor) throws CoreException
-    {
-        final boolean noProgressMonitor = (currentProjectLocation == null); // inside workspace
-
-        if (monitor == null || noProgressMonitor)
-        {
-            monitor = new NullProgressMonitor();
-        }
-        monitor.beginTask("Remove project", 3);
-        try
-        {
-            try
-            {
-                boolean removeContent = currentProject.isSynchronized(IResource.DEPTH_INFINITE);
-                currentProject.delete(removeContent, false, new SubProgressMonitor(
-                    monitor, 2));
-
-            }
-            finally
-            {
-            }
-        }
-        finally
-        {
-            monitor.done();
-            currentProject = null;
-        }
-    }
-
-    private IClasspathEntry[] getProjectClassPath(IPath src) throws CoreException
-    {
-        List<IClasspathEntry> cpEntries = new ArrayList<IClasspathEntry>();
-        cpEntries.add(JavaCore.newSourceEntry(src));
-        cpEntries.addAll(Arrays.asList(getDefaultClasspathEntry()));
-        cpEntries.add(JavaCore.newContainerEntry(new Path(
-            SigilCore.CLASSPATH_CONTAINER_PATH)));
-        IClasspathEntry[] entries = cpEntries.toArray(new IClasspathEntry[cpEntries.size()]);
-
-        return entries;
-    }
-
-    private IClasspathEntry[] getDefaultClasspathEntry()
-    {
-        IClasspathEntry[] defaultJRELibrary = PreferenceConstants.getDefaultJRELibrary();
-        /*String compliance= firstPage.getCompilerCompliance();
-        IPath jreContainerPath= new Path(JavaRuntime.JRE_CONTAINER);
-        if (compliance == null || defaultJRELibrary.length > 1 || !jreContainerPath.isPrefixOf(defaultJRELibrary[0].getPath())) {
-            // use default
-            return defaultJRELibrary;
-        }
-        IVMInstall inst= firstPage.getJVM();
-        if (inst != null) {
-            IPath newPath= jreContainerPath.append(inst.getVMInstallType().getId()).append(inst.getName());
-            return new IClasspathEntry[] { JavaCore.newContainerEntry(newPath) };
-        }*/
-        return defaultJRELibrary;
-    }
-
-    private void configureSigilProject(IProject project, String bsn, String description,
-        Version projectVersion, String vendorName, String bundleName, IPath src,
-        IProgressMonitor monitor) throws CoreException
-    {
-        if (bsn == null)
-        {
-            throw SigilCore.newCoreException("Expected bundle symbolic name to be set",
-                null);
-        }
-        
-        ISigilProjectModel sigil = SigilCore.create(project);
-        IClasspathEntry cp = JavaCore.newSourceEntry(src);
-        String encodedClasspath = sigil.getJavaModel().encodeClasspathEntry(cp);
-
-        ISigilBundle bundle = sigil.getBundle();
-        bundle.addClasspathEntry(encodedClasspath);
-
-        // fine set up other values
-        bundle.getBundleInfo().setSymbolicName(bsn);
-        if (description != null)
-        {
-            bundle.getBundleInfo().setDescription(description);
-        }
-        if (projectVersion != null)
-        {
-            bundle.setVersion(projectVersion);
-        }
-        if (vendorName != null)
-        {
-            bundle.getBundleInfo().setVendor(vendorName);
-        }
-        if (bundleName != null)
-        {
-            bundle.getBundleInfo().setName(bundleName);
-        }
-        sigil.save(monitor);
-    }
-
-    private URI getProjectLocationURI() throws CoreException
-    {
-        if (firstPage.isInWorkspace())
-        {
-            return null;
-        }
-        return firstPage.getLocationURI();
-    }
-
-    @Override
-    public boolean isPageComplete()
-    {
-        boolean result = super.isPageComplete();
-        return result;
-    }
-
-    protected void performCancel()
-    {
-        if (currentProject != null)
-        {
-            removeProject();
-        }
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizard.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizard.java
deleted file mode 100644
index eeda6b5..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizard.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.wizard.repository;
-
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-
-public class RepositoryWizard extends Wizard
-{
-
-    private IRepositoryModel model;
-
-    @Override
-    public boolean performFinish()
-    {
-        for (IWizardPage page : getPages())
-        {
-            if (page instanceof RepositoryWizardPage)
-            {
-                RepositoryWizardPage rwp = (RepositoryWizardPage) page;
-                rwp.storeFields();
-            }
-        }
-        return true;
-    }
-
-    public IRepositoryModel getModel()
-    {
-        return model;
-    }
-
-    public void init(IRepositoryModel model)
-    {
-        this.model = model;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java
deleted file mode 100644
index bf94a38..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.wizard.repository;
-
-import java.util.ArrayList;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-public abstract class RepositoryWizardPage extends WizardPage
-{
-
-    private ArrayList<FieldEditor> editors = new ArrayList<FieldEditor>();
-    private RepositoryWizard wizard;
-    private IPreferenceStore prefs;
-    private StringFieldEditor nameEditor;
-
-    protected RepositoryWizardPage(String pageName, RepositoryWizard parent)
-    {
-        super(pageName);
-        setTitle(pageName);
-        this.wizard = parent;
-    }
-
-    public abstract void createFieldEditors();
-
-    public void addField(FieldEditor editor)
-    {
-        editors.add(editor);
-    }
-
-    public void createControl(Composite parent)
-    {
-        Composite control = new Composite(parent, SWT.NONE);
-        setControl(control);
-
-        if (getModel().getType().isDynamic())
-        {
-            nameEditor = new StringFieldEditor("name", "Name:", control);
-            nameEditor.setEmptyStringAllowed(false);
-            addField(nameEditor);
-        }
-
-        createFieldEditors();
-
-        int cols = 0;
-        for (FieldEditor e : editors)
-        {
-            cols = Math.max(cols, e.getNumberOfControls());
-        }
-
-        control.setLayout(new GridLayout(cols, false));
-
-        for (FieldEditor e : editors)
-        {
-            if (e instanceof StringFieldEditor) {
-                StringFieldEditor sfe = (StringFieldEditor) e;
-                sfe.getTextControl(getFieldEditorParent()).addModifyListener(
-                    new ModifyListener()
-                    {
-                        public void modifyText(ModifyEvent e)
-                        {
-                            checkPageComplete();
-                        }
-                    });
-            }
-            e.fillIntoGrid(getFieldEditorParent(), cols);
-            e.setPreferenceStore(getStore());
-            e.load();
-        }
-
-        checkPageComplete();
-    }
-
-    protected void checkPageComplete()
-    {
-        if (nameEditor != null)
-        {
-            int len = nameEditor.getStringValue().length();
-            boolean ok = len > 0;
-            setPageComplete(ok);
-            if ( !ok ) {
-                setErrorMessage("Name should not be empty");
-            }
-            else {
-                ok = nameEditor.getStringValue().trim().length() == len;
-                setPageComplete(ok);
-                if ( !ok ) {
-                    setErrorMessage("Name cannot start or end with whitespace");
-                }
-            }
-        }
-    }
-
-    public IRepositoryModel getModel()
-    {
-        return wizard.getModel();
-    }
-    
-    protected IPreferenceStore getStore() {
-        if ( prefs == null ) {
-            prefs = SigilCore.getRepositoryPreferences().toPreferenceStore(getModel());
-        }
-        
-        return prefs;
-    }
-
-    protected Composite getFieldEditorParent()
-    {
-        return (Composite) getControl();
-    }
-
-    public void storeFields()
-    {
-        for (FieldEditor e : editors)
-        {
-            e.store();
-        }
-    }
-
-}
diff --git a/sigil/eclipse/utils/.classpath b/sigil/eclipse/utils/.classpath
deleted file mode 100644
index 53669fa..0000000
--- a/sigil/eclipse/utils/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/eclipse/utils/.project b/sigil/eclipse/utils/.project
deleted file mode 100644
index c3ac20d..0000000
--- a/sigil/eclipse/utils/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.eclipse.utils</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/eclipse/utils/.settings/org.eclipse.jdt.core.prefs b/sigil/eclipse/utils/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 655c7dd..0000000
--- a/sigil/eclipse/utils/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,263 +0,0 @@
-#Thu Sep 17 16:11:22 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/eclipse/utils/.settings/org.eclipse.jdt.ui.prefs b/sigil/eclipse/utils/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index f1824d2..0000000
--- a/sigil/eclipse/utils/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:11:22 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/eclipse/utils/DEPENDENCIES b/sigil/eclipse/utils/DEPENDENCIES
deleted file mode 100644
index 049cc85..0000000
--- a/sigil/eclipse/utils/DEPENDENCIES
+++ /dev/null
@@ -1,21 +0,0 @@
-Apache Felix Sigil Eclipse Util
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed by the The Eclipse Foundation
-(http://www.eclipse.org)
-Copyright © 2010 The Eclipse Foundation. All Rights Reserved.
-Licensed under the Eclipse Public License - v 1.0.
-
-III. License Summary
-- Apache License 2.0
-- Eclipse Public License - v 1.0
diff --git a/sigil/eclipse/utils/NOTICE b/sigil/eclipse/utils/NOTICE
deleted file mode 100644
index 9ac591a..0000000
--- a/sigil/eclipse/utils/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Eclipse Util
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/eclipse/utils/build.xml b/sigil/eclipse/utils/build.xml
deleted file mode 100644
index a14f0af..0000000
--- a/sigil/eclipse/utils/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="eclipse.utils" default="build">
-      <import file="../build.xml"/>
-</project>
diff --git a/sigil/eclipse/utils/ivy.xml b/sigil/eclipse/utils/ivy.xml
deleted file mode 100644
index ff2a3d9..0000000
--- a/sigil/eclipse/utils/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.eclipse.utils"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.eclipse.utils" />
-   </publications>
-</ivy-module>
diff --git a/sigil/eclipse/utils/plugin.xml b/sigil/eclipse/utils/plugin.xml
deleted file mode 100644
index b2a726a..0000000
--- a/sigil/eclipse/utils/plugin.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester
-            class="org.apache.felix.sigil.utils.properties.EditorPropertyTester"
-            id="org.apache.felix.sigil.utils.editorPropertyTester"
-            namespace="org.apache.felix.sigil"
-            properties="isEditorOfType"
-            type="org.eclipse.ui.IWorkbenchPart">
-      </propertyTester>
-      <propertyTester
-            class="org.apache.felix.sigil.utils.properties.PartKindPropertyTester"
-            id="org.apache.felix.sigil.runtime.PartKindPropertyTester"
-            namespace="org.apache.felix.sigil"
-            properties="partKind,partId"
-            type="org.eclipse.ui.IWorkbenchPart">
-      </propertyTester>
-      <propertyTester
-            class="org.apache.felix.sigil.utils.properties.ResourceTypePropertyTester"
-            id="org.apache.felix.sigil.utils.ResourcePropertyTester"
-            namespace="org.apache.felix.sigil"
-            properties="isResourceOfType"
-            type="org.eclipse.core.resources.IResource">
-      </propertyTester>
-   </extension>
-
-</plugin>
diff --git a/sigil/eclipse/utils/sigil.properties b/sigil/eclipse/utils/sigil.properties
deleted file mode 100644
index 47f3eeb..0000000
--- a/sigil/eclipse/utils/sigil.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--singleton: true
-
--bundles: \
-	org.apache.felix.sigil.eclipse.utils, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-	plugin.xml, \
-
--sourcedirs: \
-	src, \
-
--exports: \
-	org.apache.felix.sigil.utils, \
-
--imports: \
-	org.apache.felix.sigil.utils, \
-	org.eclipse.core.expressions, \
-	org.eclipse.core.resources, \
-	org.eclipse.core.runtime, \
-	org.eclipse.core.runtime.content, \
-	org.eclipse.core.runtime.jobs;resolve=compile, \
-	org.eclipse.jface.window;resolve=compile, \
-	org.eclipse.ui, \
-
--requires: \
-	org.eclipse.core.runtime;version=3.4.0, \
-	org.eclipse.equinox.common;version=3.4.0, \
-	org.eclipse.ui.ide;version=3.4.2, \
-	org.eclipse.ui.workbench;version=3.4.1, \
-
-header;Bundle-ActivationPolicy: lazy
-
-# end
diff --git a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/GlobCompiler.java b/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/GlobCompiler.java
deleted file mode 100644
index ff64cd1..0000000
--- a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/GlobCompiler.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.utils;
-
-import java.util.regex.Pattern;
-
-public class GlobCompiler
-{
-    public static final Pattern compile(String glob)
-    {
-        char[] chars = glob.toCharArray();
-        if (chars.length > 0)
-        {
-            StringBuilder builder = new StringBuilder(chars.length + 5);
-
-            builder.append('^');
-
-            for (char c : chars)
-            {
-                switch (c)
-                {
-                    case '*':
-                        builder.append(".*");
-                        break;
-                    case '.':
-                        builder.append("\\.");
-                        break;
-                    case '$':
-                        builder.append("\\$");
-                        break;
-                    default:
-                        builder.append(c);
-                }
-            }
-
-            return Pattern.compile(builder.toString());
-        }
-        else
-        {
-            return Pattern.compile(glob);
-        }
-    }
-}
diff --git a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/PathHelper.java b/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/PathHelper.java
deleted file mode 100644
index 2cb2772..0000000
--- a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/PathHelper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.utils;
-
-import java.io.File;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-public class PathHelper
-{
-
-    public static void scanFiles(List<IPath> paths, IPath path, String pattern,
-        boolean recurse)
-    {
-        Pattern p = GlobCompiler.compile(pattern);
-
-        for (File f : path.toFile().listFiles())
-        {
-            if (f.isDirectory() && recurse)
-            {
-                scanFiles(paths, new Path(f.getAbsolutePath()), pattern, recurse);
-            }
-            else if (f.isFile() && p.matcher(f.getName()).matches())
-            {
-                paths.add(new Path(f.getAbsolutePath()));
-            }
-        }
-    }
-}
diff --git a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/SigilUtils.java b/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/SigilUtils.java
deleted file mode 100644
index 480d102..0000000
--- a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/SigilUtils.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.utils;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-
-public final class SigilUtils
-{
-    private SigilUtils()
-    {
-    }
-
-    public static boolean isResourceType(IResource resource, String type)
-    {
-        IContentType[] types = Platform.getContentTypeManager().findContentTypesFor(
-            resource.getName());
-        for (IContentType contentType : types)
-        {
-            if (contentType.getId().equals(type))
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/properties/EditorPropertyTester.java b/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/properties/EditorPropertyTester.java
deleted file mode 100644
index 647a317..0000000
--- a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/properties/EditorPropertyTester.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.utils.properties;
-
-import org.apache.felix.sigil.utils.SigilUtils;
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPart;
-
-public class EditorPropertyTester extends PropertyTester
-{
-
-    public boolean test(Object receiver, String property, Object[] args,
-        Object expectedValue)
-    {
-        IWorkbenchPart part = (IWorkbenchPart) receiver;
-
-        boolean result = false;
-
-        if (part instanceof IEditorPart)
-        {
-            IEditorInput input = ((IEditorPart) part).getEditorInput();
-            if (input instanceof IFileEditorInput)
-            {
-                IFile file = ((IFileEditorInput) input).getFile();
-
-                if ("isEditorOfType".equals(property))
-                {
-                    result = SigilUtils.isResourceType(file, (String) expectedValue);
-                }
-            }
-        }
-
-        return result;
-    }
-
-}
diff --git a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/properties/PartKindPropertyTester.java b/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/properties/PartKindPropertyTester.java
deleted file mode 100644
index d48542b..0000000
--- a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/properties/PartKindPropertyTester.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.utils.properties;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-
-public class PartKindPropertyTester extends PropertyTester
-{
-
-    public boolean test(Object receiver, String property, Object[] args,
-        Object expectedValue)
-    {
-        IWorkbenchPart part = (IWorkbenchPart) receiver;
-
-        Object value;
-        if ("partKind".equals(property))
-        {
-            if (part instanceof IEditorPart)
-            {
-                value = "editor";
-            }
-            else if (part instanceof IViewPart)
-            {
-                value = "view";
-            }
-            else
-            {
-                value = null;
-            }
-        }
-        else if ("partId".equals(property))
-        {
-            value = part.getSite().getId();
-        }
-        else
-        {
-            value = null;
-        }
-
-        return expectedValue.equals(value);
-    }
-
-}
diff --git a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/properties/ResourceTypePropertyTester.java b/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/properties/ResourceTypePropertyTester.java
deleted file mode 100644
index 13c13f3..0000000
--- a/sigil/eclipse/utils/src/org/apache/felix/sigil/utils/properties/ResourceTypePropertyTester.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.utils.properties;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-
-public class ResourceTypePropertyTester extends PropertyTester
-{
-
-    public boolean test(Object receiver, String property, Object[] args,
-        Object expectedValue)
-    {
-        if (!(receiver instanceof IResource))
-        {
-            return false;
-        }
-
-        boolean result = false;
-
-        IResource resource = (IResource) receiver;
-        if ("isResourceOfType".equals(property))
-        {
-            IContentType[] types = Platform.getContentTypeManager().findContentTypesFor(
-                resource.getName());
-
-            for (IContentType type : types)
-            {
-                if (type.getId().equals(expectedValue))
-                {
-                    result = true;
-                    break;
-                }
-            }
-        }
-
-        return result;
-    }
-
-}
diff --git a/sigil/gogo/build.xml b/sigil/gogo/build.xml
deleted file mode 100644
index e8b2dd0..0000000
--- a/sigil/gogo/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="gogo" default="build-list">
-  <import file="../bldcommon/common.xml"/>
-</project>
diff --git a/sigil/gogo/junit/.classpath b/sigil/gogo/junit/.classpath
deleted file mode 100644
index c9ffd60..0000000
--- a/sigil/gogo/junit/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/gogo/junit/.project b/sigil/gogo/junit/.project
deleted file mode 100644
index 83e5136..0000000
--- a/sigil/gogo/junit/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.gogo.junit</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/gogo/junit/DEPENDENCIES b/sigil/gogo/junit/DEPENDENCIES
deleted file mode 100644
index bcc3ee2..0000000
--- a/sigil/gogo/junit/DEPENDENCIES
+++ /dev/null
@@ -1,20 +0,0 @@
-Apache Felix Sigil Gogo JUnit
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-n/a
-
-II. Used Third-Party Software
-
-This product uses software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-III. License Summary
-- Apache License 2.0
diff --git a/sigil/gogo/junit/NOTICE b/sigil/gogo/junit/NOTICE
deleted file mode 100644
index 4fc7c00..0000000
--- a/sigil/gogo/junit/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Gogo JUnit
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/gogo/junit/build.xml b/sigil/gogo/junit/build.xml
deleted file mode 100644
index 974b0f3..0000000
--- a/sigil/gogo/junit/build.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="gogo.junit" default="build"
-  xmlns:ivy="antlib:org.apache.ivy.ant">
-  <import file="../build.xml"/>
-</project>
diff --git a/sigil/gogo/junit/ivy.xml b/sigil/gogo/junit/ivy.xml
deleted file mode 100644
index e216d68..0000000
--- a/sigil/gogo/junit/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-       organisation="org.apache"
-       module="felix.sigil.gogo.junit"
-       status="integration"/>
-  <publications>
-    <artifact name="org.apache.felix.sigil.gogo.junit" />
-  </publications>  
-</ivy-module>
diff --git a/sigil/gogo/junit/sigil.properties b/sigil/gogo/junit/sigil.properties
deleted file mode 100644
index dfafcde..0000000
--- a/sigil/gogo/junit/sigil.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--activator: org.apache.felix.sigil.gogo.junit.Activator
-
--bundles: \
-	org.apache.felix.sigil.gogo.junit, \
-
--sourcedirs: \
-	src, \
-
--imports: \
-	junit.framework, \
-	org.apache.felix.sigil.common.junit.server, \
-	org.apache.tools.ant, \
-	org.apache.tools.ant.taskdefs.optional.junit, \
-	org.osgi.framework, \
-	org.osgi.service.command, \
-	org.osgi.util.tracker, \
-
-# end
diff --git a/sigil/gogo/junit/src/org/apache/felix/gogo/options/Option.java b/sigil/gogo/junit/src/org/apache/felix/gogo/options/Option.java
deleted file mode 100644
index 6b4a496..0000000
--- a/sigil/gogo/junit/src/org/apache/felix/gogo/options/Option.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.gogo.options;
-
-import java.util.List;
-
-public interface Option {
-    /**
-     * stop parsing on the first unknown option. This allows one parser to get its own options and
-     * then pass the remaining options to another parser.
-     * 
-     * @param stopOnBadOption
-     */
-    Option setStopOnBadOption(boolean stopOnBadOption);
-
-    /**
-     * require options to precede args. Default is false, so options can appear between or after
-     * args.
-     * 
-     * @param optionsFirst
-     */
-    Option setOptionsFirst(boolean optionsFirst);
-
-    /**
-     * parse arguments. If skipArgv0 is true, then parsing begins at arg1. This allows for commands
-     * where argv0 is the command name rather than a real argument.
-     * 
-     * @param argv
-     * @param skipArg0
-     * @return
-     */
-    Option parse(List<? extends Object> argv, boolean skipArg0);
-
-    /**
-     * parse arguments.
-     * 
-     * @see {@link #parse(List, boolean)
-
-     */
-    Option parse(List<? extends Object> argv);
-
-    /**
-     * parse arguments.
-     * 
-     * @see {@link #parse(List, boolean)
-
-     */
-    Option parse(Object[] argv, boolean skipArg0);
-
-    /**
-     * parse arguments.
-     * 
-     * @see {@link #parse(List, boolean)
-
-     */
-    Option parse(Object[] argv);
-
-    /**
-     * test whether specified option has been explicitly set.
-     * 
-     * @param name
-     * @return
-     */
-    boolean isSet(String name);
-
-    /**
-     * get value of named option. If multiple options given, this method returns the last one. Use
-     * {@link #getList(String)} to get all values.
-     * 
-     * @param name
-     * @return
-     * @throws IllegalArgumentException
-     *             if value is not a String.
-     */
-    String get(String name);
-
-    /**
-     * get list of all values for named option.
-     * 
-     * @param name
-     * @return empty list if option not given and no default specified.
-     * @throws IllegalArgumentException
-     *             if all values are not Strings.
-     */
-    List<String> getList(String name);
-
-    /**
-     * get value of named option as an Object. If multiple options given, this method returns the
-     * last one. Use {@link #getObjectList(String)} to get all values.
-     * 
-     * @param name
-     * @return
-     */
-    Object getObject(String name);
-
-    /**
-     * get list of all Object values for named option.
-     * 
-     * @param name
-     * @return
-     */
-    List<Object> getObjectList(String name);
-
-    /**
-     * get value of named option as a Number.
-     * 
-     * @param name
-     * @return
-     * @throws IllegalArgumentException
-     *             if argument is not a Number.
-     */
-    int getNumber(String name);
-
-    /**
-     * get remaining non-options args as Strings.
-     * 
-     * @return
-     * @throws IllegalArgumentException
-     *             if args are not Strings.
-     */
-    List<String> args();
-
-    /**
-     * get remaining non-options args as Objects.
-     * 
-     * @return
-     */
-    List<Object> argObjects();
-
-    /**
-     * print usage message to System.err.
-     */
-    void usage();
-
-    /**
-     * print specified usage error to System.err. You should explicitly throw the returned
-     * exception.
-     * 
-     * @param error
-     * @return IllegalArgumentException
-     */
-    IllegalArgumentException usageError(String error);
-}
diff --git a/sigil/gogo/junit/src/org/apache/felix/gogo/options/Options.java b/sigil/gogo/junit/src/org/apache/felix/gogo/options/Options.java
deleted file mode 100644
index e2fdba0..0000000
--- a/sigil/gogo/junit/src/org/apache/felix/gogo/options/Options.java
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.gogo.options;
-
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Yet another GNU long options parser. This one is configured by parsing its Usage string.
- */
-public class Options implements Option {
-    public static void main(String[] args) {
-        final String[] usage = {
-            "test - test Options usage",
-            "  text before Usage: is displayed when usage() is called and no error has occurred.",
-            "  so can be used as a simple help message.",
-            "",
-            "Usage: testOptions [OPTION]... PATTERN [FILES]...",
-            "  Output control: arbitary non-option text can be included.",
-            "  -? --help                show help",
-            "  -c --count=COUNT           show COUNT lines",
-            "  -h --no-filename         suppress the prefixing filename on output",
-            "  -q --quiet, --silent     suppress all normal output",
-            "     --binary-files=TYPE   assume that binary files are TYPE",
-            "                           TYPE is 'binary', 'text', or 'without-match'",
-            "  -I                       equivalent to --binary-files=without-match",
-            "  -d --directories=ACTION  how to handle directories (default=skip)",
-            "                           ACTION is 'read', 'recurse', or 'skip'",
-            "  -D --devices=ACTION      how to handle devices, FIFOs and sockets",
-            "                           ACTION is 'read' or 'skip'",
-            "  -R, -r --recursive       equivalent to --directories=recurse" };
-
-        Option opt = Options.compile(usage).parse(args);
-
-        if (opt.isSet("help")) {
-            opt.usage(); // includes text before Usage:
-            return;
-        }
-
-        if (opt.args().size() == 0)
-            throw opt.usageError("PATTERN not specified");
-
-        System.out.println(opt);
-        if (opt.isSet("count"))
-            System.out.println("count = " + opt.getNumber("count"));
-        System.out.println("--directories specified: " + opt.isSet("directories"));
-        System.out.println("directories=" + opt.get("directories"));
-    }
-
-    public static final String NL = System.getProperty("line.separator", "\n");
-
-    // Note: need to double \ within ""
-    private static final String regex = "(?x)\\s*" + "(?:-([^-]))?" + // 1: short-opt-1
-            "(?:,?\\s*-(\\w))?" + // 2: short-opt-2
-            "(?:,?\\s*--(\\w[\\w-]*)(=\\w+)?)?" + // 3: long-opt-1 and 4:arg-1
-            "(?:,?\\s*--(\\w[\\w-]*))?" + // 5: long-opt-2
-            ".*?(?:\\(default=(.*)\\))?\\s*"; // 6: default
-
-    private static final int GROUP_SHORT_OPT_1 = 1;
-    private static final int GROUP_SHORT_OPT_2 = 2;
-    private static final int GROUP_LONG_OPT_1 = 3;
-    private static final int GROUP_ARG_1 = 4;
-    private static final int GROUP_LONG_OPT_2 = 5;
-    private static final int GROUP_DEFAULT = 6;
-
-    private final Pattern parser = Pattern.compile(regex);
-    private final Pattern uname = Pattern.compile("^Usage:\\s+(\\w+)");
-
-    private final Map<String, Boolean> unmodifiableOptSet;
-    private final Map<String, Object> unmodifiableOptArg;
-    private final Map<String, Boolean> optSet = new HashMap<String, Boolean>();
-    private final Map<String, Object> optArg = new HashMap<String, Object>();
-
-    private final Map<String, String> optName = new HashMap<String, String>();
-    private final Map<String, String> optAlias = new HashMap<String, String>();
-    private final List<Object> xargs = new ArrayList<Object>();
-    private List<String> args = null;
-
-    private static final String UNKNOWN = "unknown";
-    private String usageName = UNKNOWN;
-    private int usageIndex = 0;
-
-    private final String[] spec;
-    private final String[] gspec;
-    private final String defOpts;
-    private final String[] defArgs;
-    private PrintStream errStream = System.err;
-    private String error = null;
-
-    private boolean optionsFirst = false;
-    private boolean stopOnBadOption = false;
-
-    public static Option compile(String[] optSpec) {
-        return new Options(optSpec, null, null);
-    }
-
-    public static Option compile(String optSpec) {
-        return compile(optSpec.split("\\n"));
-    }
-
-    public static Option compile(String[] optSpec, Option gopt) {
-        return new Options(optSpec, null, gopt);
-    }
-
-    public static Option compile(String[] optSpec, String[] gspec) {
-        return new Options(optSpec, gspec, null);
-    }
-
-    public Option setStopOnBadOption(boolean stopOnBadOption) {
-        this.stopOnBadOption = stopOnBadOption;
-        return this;
-    }
-
-    public Option setOptionsFirst(boolean optionsFirst) {
-        this.optionsFirst = optionsFirst;
-        return this;
-    }
-
-    public boolean isSet(String name) {
-        if (!optSet.containsKey(name))
-            throw new IllegalArgumentException("option not defined in spec: " + name);
-
-        return optSet.get(name);
-    }
-
-    public Object getObject(String name) {
-        if (!optArg.containsKey(name))
-            throw new IllegalArgumentException("option not defined with argument: " + name);
-
-        List<Object> list = getObjectList(name);
-
-        return list.isEmpty() ? "" : list.get(list.size() - 1);
-    }
-
-    @SuppressWarnings("unchecked")
-    public List<Object> getObjectList(String name) {
-        List<Object> list;
-        Object arg = optArg.get(name);
-
-        if ( arg == null ) {
-            throw new IllegalArgumentException("option not defined with argument: " + name);
-        }
-        
-        if (arg instanceof String) { // default value
-            list = new ArrayList<Object>();
-            if (!"".equals(arg))
-                list.add(arg);
-        }
-        else {
-            list = (List<Object>) arg;
-        }
-
-        return list;
-    }
-
-    public List<String> getList(String name) {
-        ArrayList<String> list = new ArrayList<String>();
-        for (Object o : getObjectList(name)) {
-            try {
-                list.add((String) o);
-            } catch (ClassCastException e) {
-                throw new IllegalArgumentException("option not String: " + name);
-            }
-        }
-        return list;
-    }
-
-    @SuppressWarnings("unchecked")
-    private void addArg(String name, Object value) {
-        List<Object> list;
-        Object arg = optArg.get(name);
-
-        if (arg instanceof String) { // default value
-            list = new ArrayList<Object>();
-            optArg.put(name, list);
-        }
-        else {
-            list = (List<Object>) arg;
-        }
-
-        list.add(value);
-    }
-
-    public String get(String name) {
-        try {
-            return (String) getObject(name);
-        } catch (ClassCastException e) {
-            throw new IllegalArgumentException("option not String: " + name);
-        }
-    }
-
-    public int getNumber(String name) {
-        String number = get(name);
-        try {
-            if (number != null)
-                return Integer.parseInt(number);
-            return 0;
-        } catch (NumberFormatException e) {
-            throw new IllegalArgumentException("option '" + name + "' not Number: " + number);
-        }
-    }
-
-    public List<Object> argObjects() {
-        return xargs;
-    }
-
-    public List<String> args() {
-        if (args == null) {
-            args = new ArrayList<String>();
-            for (Object arg : xargs) {
-                args.add(arg == null ? "null" : arg.toString());
-            }
-        }
-        return args;
-    }
-
-    public void usage() {
-        StringBuilder buf = new StringBuilder();
-        int index = 0;
-
-        if (error != null) {
-            buf.append(error);
-            buf.append(NL);
-            index = usageIndex;
-        }
-
-        for (int i = index; i < spec.length; ++i) {
-            buf.append(spec[i]);
-            buf.append(NL);
-        }
-
-        String msg = buf.toString();
-
-        if (errStream != null) {
-            errStream.print(msg);
-        }
-    }
-
-    /**
-     * prints usage message and returns IllegalArgumentException, for you to throw.
-     */
-    public IllegalArgumentException usageError(String s) {
-        error = usageName + ": " + s;
-        usage();
-        return new IllegalArgumentException(error);
-    }
-
-    // internal constructor
-    private Options(String[] spec, String[] gspec, Option opt) {
-        this.gspec = gspec;
-        Options gopt = (Options) opt;
-
-        if (gspec == null && gopt == null) {
-            this.spec = spec;
-        }
-        else {
-            ArrayList<String> list = new ArrayList<String>();
-            list.addAll(Arrays.asList(spec));
-            list.addAll(Arrays.asList(gspec != null ? gspec : gopt.gspec));
-            this.spec = list.toArray(new String[0]);
-        }
-
-        Map<String, Boolean> myOptSet = new HashMap<String, Boolean>();
-        Map<String, Object> myOptArg = new HashMap<String, Object>();
-
-        parseSpec(myOptSet, myOptArg);
-
-        if (gopt != null) {
-            for (Entry<String, Boolean> e : gopt.optSet.entrySet()) {
-                if (e.getValue())
-                    myOptSet.put(e.getKey(), true);
-            }
-
-            for (Entry<String, Object> e : gopt.optArg.entrySet()) {
-                if (!e.getValue().equals(""))
-                    myOptArg.put(e.getKey(), e.getValue());
-            }
-
-            gopt.reset();
-        }
-
-        unmodifiableOptSet = Collections.unmodifiableMap(myOptSet);
-        unmodifiableOptArg = Collections.unmodifiableMap(myOptArg);
-
-        defOpts = System.getenv(usageName.toUpperCase() + "_OPTS");
-        defArgs = (defOpts != null) ? defOpts.split("\\s+") : new String[0];
-    }
-
-    /**
-     * parse option spec.
-     */
-    private void parseSpec(Map<String, Boolean> myOptSet, Map<String, Object> myOptArg) {
-        int index = 0;
-        for (String line : spec) {
-            Matcher m = parser.matcher(line);
-
-            if (m.matches()) {
-                final String opt = m.group(GROUP_LONG_OPT_1);
-                final String name = (opt != null) ? opt : m.group(GROUP_SHORT_OPT_1);
-
-                if (name != null) {
-                    if (myOptSet.containsKey(name))
-                        throw new IllegalArgumentException("duplicate option in spec: --" + name);
-                    myOptSet.put(name, false);
-                }
-
-                String dflt = (m.group(GROUP_DEFAULT) != null) ? m.group(GROUP_DEFAULT) : "";
-                if (m.group(GROUP_ARG_1) != null)
-                    myOptArg.put(opt, dflt);
-
-                String opt2 = m.group(GROUP_LONG_OPT_2);
-                if (opt2 != null) {
-                    optAlias.put(opt2, opt);
-                    myOptSet.put(opt2, false);
-                    if (m.group(GROUP_ARG_1) != null)
-                        myOptArg.put(opt2, "");
-                }
-
-                for (int i = 0; i < 2; ++i) {
-                    String sopt = m.group(i == 0 ? GROUP_SHORT_OPT_1 : GROUP_SHORT_OPT_2);
-                    if (sopt != null) {
-                        if (optName.containsKey(sopt))
-                            throw new IllegalArgumentException("duplicate option in spec: -" + sopt);
-                        optName.put(sopt, name);
-                    }
-                }
-            }
-
-            if (usageName == UNKNOWN) {
-                Matcher u = uname.matcher(line);
-                if (u.find()) {
-                    usageName = u.group(1);
-                    usageIndex = index;
-                }
-            }
-
-            index++;
-        }
-    }
-
-    private void reset() {
-        optSet.clear();
-        optSet.putAll(unmodifiableOptSet);
-        optArg.clear();
-        optArg.putAll(unmodifiableOptArg);
-        xargs.clear();
-        args = null;
-        error = null;
-    }
-
-    public Option parse(Object[] argv) {
-        return parse(argv, false);
-    }
-
-    public Option parse(List<? extends Object> argv) {
-        return parse(argv, false);
-    }
-
-    public Option parse(Object[] argv, boolean skipArg0) {
-        if (null == argv)
-            throw new IllegalArgumentException("argv is null");
-        
-        return parse(Arrays.asList(argv), skipArg0);
-    }
-
-    public Option parse(List<? extends Object> argv, boolean skipArg0) {
-        reset();
-        List<Object> args = new ArrayList<Object>();
-        args.addAll(Arrays.asList(defArgs));
-
-        for (Object arg : argv) {
-            if (skipArg0) {
-                skipArg0 = false;
-                usageName = arg.toString();
-            }
-            else {
-                args.add(arg);
-            }
-        }
-
-        String needArg = null;
-        String needOpt = null;
-        boolean endOpt = false;
-
-        for (Object oarg : args) {
-            String arg = oarg == null ? "null" : oarg.toString();
-
-            if (endOpt) {
-                xargs.add(oarg);
-            }
-            else if (needArg != null) {
-                addArg(needArg, oarg);
-                needArg = null;
-                needOpt = null;
-            }
-            else if (!arg.startsWith("-") || "-".equals(oarg)) {
-                if (optionsFirst)
-                    endOpt = true;
-                xargs.add(oarg);
-            }
-            else {
-                if (arg.equals("--"))
-                    endOpt = true;
-                else if (arg.startsWith("--")) {
-                    int eq = arg.indexOf("=");
-                    String value = (eq == -1) ? null : arg.substring(eq + 1);
-                    String name = arg.substring(2, ((eq == -1) ? arg.length() : eq));
-                    List<String> names = new ArrayList<String>();
-
-                    if (optSet.containsKey(name)) {
-                        names.add(name);
-                    }
-                    else {
-                        for (String k : optSet.keySet()) {
-                            if (k.startsWith(name))
-                                names.add(k);
-                        }
-                    }
-
-                    switch (names.size()) {
-                    case 1:
-                        name = names.get(0);
-                        optSet.put(name, true);
-                        if (optArg.containsKey(name)) {
-                            if (value != null)
-                                addArg(name, value);
-                            else
-                                needArg = name;
-                        }
-                        else if (value != null) {
-                            throw usageError("option '--" + name + "' doesn't allow an argument");
-                        }
-                        break;
-
-                    case 0:
-                        if (stopOnBadOption) {
-                            endOpt = true;
-                            xargs.add(oarg);
-                            break;
-                        }
-                        else
-                            throw usageError("invalid option '--" + name + "'");
-
-                    default:
-                        throw usageError("option '--" + name + "' is ambiguous: " + names);
-                    }
-                }
-                else {
-                    int i = 0;
-                    for (String c : arg.substring(1).split("")) {
-                        if (i++ == 0)
-                            continue;
-                        if (optName.containsKey(c)) {
-                            String name = optName.get(c);
-                            optSet.put(name, true);
-                            if (optArg.containsKey(name)) {
-                                if (i < arg.length()) {
-                                    addArg(name, arg.substring(i));
-                                }
-                                else {
-                                    needOpt = c;
-                                    needArg = name;
-                                }
-                                break;
-                            }
-                        }
-                        else {
-                            if (stopOnBadOption) {
-                                xargs.add("-" + c);
-                                endOpt = true;
-                            }
-                            else
-                                throw usageError("invalid option '" + c + "'");
-                        }
-                    }
-                }
-            }
-        }
-
-        if (needArg != null) {
-            String name = (needOpt != null) ? needOpt : "--" + needArg;
-            throw usageError("option '" + name + "' requires an argument");
-        }
-
-        // remove long option aliases
-        for (Entry<String, String> alias : optAlias.entrySet()) {
-            if (optSet.get(alias.getKey())) {
-                optSet.put(alias.getValue(), true);
-                if (optArg.containsKey(alias.getKey()))
-                    optArg.put(alias.getValue(), optArg.get(alias.getKey()));
-            }
-            optSet.remove(alias.getKey());
-            optArg.remove(alias.getKey());
-        }
-
-        return this;
-    }
-
-    @Override
-    public String toString() {
-        return "isSet" + optSet + "\nArg" + optArg + "\nargs" + xargs;
-    }
-
-}
diff --git a/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/Activator.java b/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/Activator.java
deleted file mode 100644
index 1a13438..0000000
--- a/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/Activator.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.sigil.gogo.junit;
-
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Hashtable;
-
-import junit.framework.Assert;
-
-import org.apache.felix.sigil.common.junit.server.JUnitService;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-import org.osgi.service.command.CommandProcessor;
-import org.osgi.util.tracker.ServiceTracker;
-
-
-public class Activator implements BundleActivator
-{
-
-    public void start( final BundleContext ctx ) throws Exception
-    {
-        ServiceTracker tracker = new ServiceTracker( ctx, JUnitService.class.getName(), null );
-        tracker.open();
-
-        Hashtable<String, Object> props = new Hashtable<String, Object>();
-        props.put( CommandProcessor.COMMAND_SCOPE, "sigil" );
-        props.put( CommandProcessor.COMMAND_FUNCTION, new String[]
-            { "runTests", "listTests" } );
-
-        ctx.registerService( SigilJunitRunner.class.getName(), new SigilJunitRunner( tracker ), props );
-
-        props.put( CommandProcessor.COMMAND_FUNCTION, new String[]
-            { "newTest", "newTestSuite" } );
-        ctx.registerService( SigilTestAdapter.class.getName(), new SigilTestAdapter(), props );
-
-        props.put( CommandProcessor.COMMAND_SCOPE, "junit" );
-        props.put( CommandProcessor.COMMAND_FUNCTION, getAssertMethods() );
-        ctx.registerService( Assert.class.getName(), new Assert()
-        {
-        }, props );
-    }
-
-
-    /**
-     * @return
-     */
-    private static String[] getAssertMethods()
-    {
-        ArrayList<String> list = new ArrayList<String>();
-        for ( Method m : Assert.class.getDeclaredMethods() )
-        {
-            if ( Modifier.isPublic( m.getModifiers() ) ) {
-                list.add( m.getName() );
-            }
-        }
-        return list.toArray( new String[list.size()] );
-    }
-
-
-    public void stop( BundleContext ctx ) throws Exception
-    {
-    }
-
-}
diff --git a/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/PrintListener.java b/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/PrintListener.java
deleted file mode 100644
index 627dcda..0000000
--- a/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/PrintListener.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.gogo.junit;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestListener;
-
-public class PrintListener implements TestListener
-{
-
-    public PrintListener()
-    {
-    }
-
-    public void startTest(Test test)
-    {
-        System.out.println("Start " + test);
-        System.out.flush();
-    }
-
-    public void endTest(Test test)
-    {
-        System.out.println("End " + test);
-        System.out.flush();
-    }
-
-    public void addError(Test test, Throwable t)
-    {
-        System.out.println("Error " + test);
-        t.printStackTrace(System.out);
-        System.out.flush();
-    }
-
-    public void addFailure(Test test, AssertionFailedError error)
-    {
-        System.out.println("Failure " + test + ": " + error.getMessage());
-        System.out.flush();
-    }
-}
diff --git a/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/SigilJunitRunner.java b/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/SigilJunitRunner.java
deleted file mode 100644
index 8a43018..0000000
--- a/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/SigilJunitRunner.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.gogo.junit;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import junit.framework.TestCase;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.apache.felix.gogo.options.Option;
-import org.apache.felix.gogo.options.Options;
-import org.apache.felix.sigil.common.junit.server.JUnitService;
-import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;
-import org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter;
-import org.osgi.util.tracker.ServiceTracker;
-
-public class SigilJunitRunner
-{
-    private ServiceTracker tracker;
-
-    public SigilJunitRunner(ServiceTracker tracker)
-    {
-        this.tracker = tracker;
-    }
-
-    public boolean runTests(Object[] args) throws IOException
-    {
-        final String[] usage = {
-        "runTests - run unit tests",
-        "Usage: runTests [OPTION]... [TESTS]...",
-        "  -? --help                show help",
-        "  -d --directory=DIR       Write test results to specified directory",
-        "  -q --quiet               Do not output test results to console"};
-        
-        Option opts = Options.compile( usage ).parse( args );
-        
-        boolean quiet = opts.isSet( "quiet" );
-        Object d = opts.isSet( "directory" ) ? opts.getObject( "directory" ) : null;
-        File dir = null;
-        if (d != null)
-        {
-            if ( d instanceof File ) {
-                dir = ( File ) d;
-            }
-            else {
-                dir = new File(d.toString());                
-            }
-            dir.mkdirs();
-            if (!quiet) {
-                System.out.println("Writing results to " + dir.getAbsolutePath());
-                System.out.flush();
-            }
-        }
-        
-        List<Object> tests = opts.argObjects();
-        
-        return runTests(tests, quiet, dir);
-    }
-    
-    public void listTests() {
-        JUnitService service = ( JUnitService ) tracker.getService();
-        
-        if ( service == null ) {
-            throw new IllegalStateException(JUnitService.class.getName() + " not found");
-        }
-        
-        for (String t : service.getTests())
-        {
-            System.out.println("\t" + t);
-            System.out.flush();
-        }
-    }
-    
-    private boolean runTests(List<Object> tests, boolean quiet, File dir) throws IOException
-    {
-        int count = 0;
-        int failures = 0;
-        int errors = 0;
-        
-        TestSuite[] suites = buildTestSuites(tests);
-        
-        if (suites.length > 0) {
-            // redirect io to capture test output - broken due to gogo bug
-            PrintStream oldOut = System.out;
-            PrintStream oldErr = System.err;
-            ByteArrayOutputStream tempOut = new ByteArrayOutputStream();
-            ByteArrayOutputStream tempErr = new ByteArrayOutputStream();
-            
-            System.setOut( new PrintStream( tempOut, false ) );
-            System.setErr( new PrintStream( tempErr, false ) );
-            
-            try {
-                for (TestSuite test : suites)
-                {
-                    TestResult result = new TestResult();
-    
-                    runTests(test, result, quiet, dir, tempOut, tempErr);
-    
-                    tempOut.reset();
-                    tempErr.reset();
-                    count += result.runCount();
-                    failures += result.failureCount();
-                    errors += result.errorCount();
-                }
-            }
-            finally {
-                System.setOut( oldOut );
-                System.setErr( oldErr );                    
-            }
-        }
-
-        System.out.println("Ran " + count + " tests. " + failures + " failures " + errors
-            + " errors.");
-        System.out.flush();
-
-        return failures + errors == 0;
-    }
-
-    /**
-     * @param tests
-     * @return
-     */
-    private TestSuite[] buildTestSuites( List<Object> tests )
-    {
-        ArrayList<TestSuite> suites = new ArrayList<TestSuite>(tests.size());
-        
-        for (Object o : tests) {
-            TestSuite[] s = coerceTest(o);
-            if (s.length == 0)
-            {
-                System.err.println("No tests found for " + o);
-            }
-            else
-            {
-                for (TestSuite t : s) {
-                    suites.add(t);
-                }
-            }
-        }
-        
-        return suites.toArray(new TestSuite[suites.size()]);
-    }
-
-    /**
-     * @param tempOut
-     * @param tempErr
-     * @throws IOException 
-     */
-    private void runTests( TestSuite test, TestResult result, boolean quiet, File dir, ByteArrayOutputStream tempOut, ByteArrayOutputStream tempErr ) throws IOException
-    {
-        if (!quiet)
-        {
-            result.addListener(new PrintListener());
-        }
-
-        JUnitTest antTest = null;
-        FileOutputStream fout = null;
-        XMLJUnitResultFormatter formatter = null;
-
-        if (dir != null)
-        {
-            antTest = new JUnitTest(test.getName(), false, false, true);
-
-            formatter = new XMLJUnitResultFormatter();
-            formatter.startTestSuite(antTest);
-
-            String name = "TEST-" + test.getName() + ".xml";
-
-            File f = new File(dir, name);
-            fout = new FileOutputStream(f);
-            formatter.setOutput(fout);
-            result.addListener(formatter);
-        }
-        
-        test.run(result);
-
-        System.out.flush();
-        System.err.flush();
-
-        if ( dir != null ) {
-            formatter.setSystemOutput( tempOut.toString() );
-            formatter.setSystemError( tempErr.toString() );
-            
-            antTest.setCounts(result.runCount(), result.failureCount(),
-                result.errorCount());
-            
-            formatter.endTestSuite(antTest);
-            
-            fout.flush();
-            fout.close();
-        }                        
-    }
-
-    /**
-     * @param o
-     * @return
-     */
-    private TestSuite[] coerceTest( Object o )
-    {
-        ArrayList<TestSuite> tests = new ArrayList<TestSuite>();
-        if (o instanceof String ) {
-            return findTests(( String ) o);
-        }
-        else if ( o instanceof Iterable<?> ) {
-            Iterable<?> i = ( Iterable<?> ) o;
-            for ( Object t : i ) {
-                tests.add(doCoerce(t));
-            }
-        }
-        // not sure if this next test is necessary - does Iterable capture it?
-        else if ( o.getClass().isArray() ) {
-            for (int i = 0; i < Array.getLength( o ); i++ ) {
-                Object t = Array.get( o, i );
-                tests.add(doCoerce(t));
-            }
-        }
-        else {
-            tests.add( doCoerce(o) );
-        }
-        return tests.toArray( new TestSuite[tests.size()] );
-    }
-
-    /**
-     * @param o
-     * @return
-     */
-    private TestSuite doCoerce( Object o )
-    {
-        if ( o instanceof TestCase ) {
-            TestCase t = ( TestCase ) o;
-            TestSuite suite = new TestSuite(t.getName());
-            suite.addTest(t);
-            return suite;
-        }
-        else if (o instanceof TestSuite ) {
-            return ( TestSuite ) o;
-        }
-        else {
-            throw new IllegalArgumentException("Unexpected test type " + o.getClass().getName() );
-        }
-    }
-
-    private TestSuite[] findTests(String t)
-    {
-        JUnitService service = ( JUnitService ) tracker.getService();
-        
-        if ( service == null ) {
-            throw new IllegalStateException(JUnitService.class.getName() + " not found");
-        }
-        
-        if (t.contains("*"))
-        {
-            Pattern p = compile(t);
-            LinkedList<TestSuite> tests = new LinkedList<TestSuite>();
-            for (String n : service.getTests())
-            {
-                if (p.matcher(n).matches())
-                {
-                    tests.add(service.createTest(n));
-                }
-            }
-            return tests.toArray(new TestSuite[tests.size()]);
-        }
-        else
-        {
-            TestSuite test = service.createTest(t);
-            return test == null ? new TestSuite[0] : new TestSuite[] { test };
-        }
-    }
-
-    public static final Pattern compile(String glob)
-    {
-        char[] chars = glob.toCharArray();
-        if (chars.length > 0)
-        {
-            StringBuilder builder = new StringBuilder(chars.length + 5);
-
-            builder.append('^');
-
-            for (char c : chars)
-            {
-                switch (c)
-                {
-                    case '*':
-                        builder.append(".*");
-                        break;
-                    case '.':
-                        builder.append("\\.");
-                        break;
-                    case '$':
-                        builder.append("\\$");
-                        break;
-                    default:
-                        builder.append(c);
-                }
-            }
-
-            return Pattern.compile(builder.toString());
-        }
-        else
-        {
-            return Pattern.compile(glob);
-        }
-    }
-}
diff --git a/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/SigilTestAdapter.java b/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/SigilTestAdapter.java
deleted file mode 100644
index 1755b73..0000000
--- a/sigil/gogo/junit/src/org/apache/felix/sigil/gogo/junit/SigilTestAdapter.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.sigil.gogo.junit;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Arrays;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.osgi.service.command.CommandSession;
-import org.osgi.service.command.Function;
-
-public class SigilTestAdapter
-{
-    public TestCase newTest(final CommandSession session, final String name,
-        final Function f, final Object... args)
-    {
-        return new TestCase(name)
-        {
-            public void runTest() throws Throwable
-            {
-                try
-                {
-                    f.execute(session, Arrays.asList(args));
-                }
-                catch (Throwable t)
-                {
-                    if (t instanceof InvocationTargetException)
-                        t = t.getCause();
-
-                    // stack trace is no use for identifying the location of
-                    // junit:assert methods in scripts.
-                    // So add gogo script location to stack trace.
-                    Object loc = session.get(".location");
-                    if (loc != null)
-                    {
-                        // file:/path/to/file:line.column
-                        String sloc = (String) loc;
-                        String fileName = sloc;
-                        int lineNumber = 0;
-
-                        if (sloc.matches(".*:[\\d.]+$"))
-                        {
-                            int colon = sloc.lastIndexOf(':');
-                            fileName = sloc.substring(0, colon);
-                            String number = sloc.substring(colon + 1);
-                            int dot = number.indexOf('.');
-                            if (dot > 0)
-                                number = number.substring(0, dot);
-                            lineNumber = Integer.parseInt(number);
-                        }
-
-                        StackTraceElement[] trace = t.getStackTrace();
-                        StackTraceElement element = new StackTraceElement(
-                            "SigilTestAdaptor", "runTest", fileName, lineNumber);
-
-                        StackTraceElement[] ev = new StackTraceElement[1 + trace.length];
-                        int i = 0;
-                        ev[i++] = element;
-                        for (StackTraceElement e : trace)
-                            ev[i++] = e;
-
-                        t.setStackTrace(ev);
-                    }
-
-                    throw t;
-                }
-            }
-        };
-    }
-
-    public TestSuite newTestSuite(String name, Test... tests)
-    {
-        TestSuite suite = new TestSuite(name);
-        for (Test t : tests)
-        {
-            suite.addTest(t);
-        }
-        return suite;
-    }
-}
diff --git a/sigil/gogo/sigil-defaults.properties b/sigil/gogo/sigil-defaults.properties
deleted file mode 100644
index bfc9d0d..0000000
--- a/sigil/gogo/sigil-defaults.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-# sigil common default properties
--defaults: ${BLDCOMMON:-../bldcommon}/sigil-defaults.properties
diff --git a/sigil/ivy/build.xml b/sigil/ivy/build.xml
deleted file mode 100644
index 86d090a..0000000
--- a/sigil/ivy/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="ivy" default="build-list">
-  <import file="../bldcommon/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/.classpath b/sigil/ivy/resolver/.classpath
deleted file mode 100644
index c9ffd60..0000000
--- a/sigil/ivy/resolver/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.apache.felix.sigil.classpathContainer"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/sigil/ivy/resolver/.project b/sigil/ivy/resolver/.project
deleted file mode 100644
index 63efc3a..0000000
--- a/sigil/ivy/resolver/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.apache.felix.sigil.ivy.resolver</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.apache.felix.sigil.eclipse.core.sigilBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.apache.felix.sigil.sigilnature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/sigil/ivy/resolver/.settings/org.eclipse.jdt.core.prefs b/sigil/ivy/resolver/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index c4847fd..0000000
--- a/sigil/ivy/resolver/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,258 +0,0 @@
-#Thu Sep 17 16:06:10 BST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=false
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
-org.eclipse.jdt.core.formatter.comment.format_line_comments=false
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=1
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=90
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/sigil/ivy/resolver/.settings/org.eclipse.jdt.ui.prefs b/sigil/ivy/resolver/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index f689a92..0000000
--- a/sigil/ivy/resolver/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Sep 17 16:06:10 BST 2009
-eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
-formatter_settings_version=11
diff --git a/sigil/ivy/resolver/DEPENDENCIES b/sigil/ivy/resolver/DEPENDENCIES
deleted file mode 100644
index 0c03e3b..0000000
--- a/sigil/ivy/resolver/DEPENDENCIES
+++ /dev/null
@@ -1,25 +0,0 @@
-Apache Felix Sigil Common Core
-Copyright 2010 The Apache Software Foundation
-
-This software was developed at the Apache Software Foundation
-(http://www.apache.org) and may have dependencies on other
-Apache software licensed under Apache License 2.0.
-
-I. Included Third-Party Software
-
-This product includes software developed by Peter Kriens
-(http://www.aqute.biz/Code/Bnd)
-Copyright 2006-2009 aQute, All rights reserved
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
-Licensed under the Apache License 2.0.
-
-II. Used Third-Party Software
-
-n/a
-
-III. License Summary
-- Apache License 2.0
diff --git a/sigil/ivy/resolver/NOTICE b/sigil/ivy/resolver/NOTICE
deleted file mode 100644
index 00d694d..0000000
--- a/sigil/ivy/resolver/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Felix Sigil Ivy Resolver
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-Licensed under the Apache License 2.0.
diff --git a/sigil/ivy/resolver/build.xml b/sigil/ivy/resolver/build.xml
deleted file mode 100644
index 932a91d..0000000
--- a/sigil/ivy/resolver/build.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="ivy.resolver" default="build"
-  xmlns:ivy="antlib:org.apache.ivy.ant">
-  <import file="../build.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/example/dependence/README b/sigil/ivy/resolver/example/dependence/README
deleted file mode 100644
index 09ecfa8..0000000
--- a/sigil/ivy/resolver/example/dependence/README
+++ /dev/null
@@ -1,19 +0,0 @@
-# http://sigil.codecauldron.org
-
-This example is based on the Ivy Tutorial project dependencies example:
-http://ant.apache.org/ivy/history/latest-milestone/tutorial/dependence.html
-
-Dependencies are resolved using an OBR index for the Spring repository,
-hosted at sigil.codecauldron.org.
-
-1. set ivy.jar location in settings/build.properties
-
-2. build dependee
-$ cd dependee
-$ ant jar
-$ ant publish
-
-3. build depender
-$ cd ../depender
-$ ant
-
diff --git a/sigil/ivy/resolver/example/dependence/build.xml b/sigil/ivy/resolver/example/dependence/build.xml
deleted file mode 100644
index ccc460d..0000000
--- a/sigil/ivy/resolver/example/dependence/build.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project default="clean">
-    
-    <!-- ================================= 
-          target: clean              
-         ================================= -->
-    <target name="clean" description="--> clean directories">
-        <delete includeemptydirs="true"> 
-            <fileset dir="settings">
-		<exclude name="ivysettings.*" />
-		<exclude name="sigil-repos.properties" />
-            </fileset>
-	</delete>
-        <ant dir="dependee" antfile="build.xml" target="clean" inheritall="false" inheritrefs="false" />
-        <ant dir="depender" antfile="build.xml" target="clean" inheritall="false" inheritrefs="false" />
-    </target>
-
-    <!-- ================================= 
-          target: all              
-         ================================= -->
-    <target name="all" depends="clean" description="--> make the whole example of dependency">
-        <ant dir="dependee" antfile="build.xml" target="publish" inheritall="false" inheritrefs="false" />
-        <ant dir="depender" antfile="build.xml" inheritall="false" inheritrefs="false" />
-        <ant dir="dependee" antfile="build.xml" target="publish" inheritall="false" inheritrefs="false" />
-        <ant dir="depender" antfile="build.xml" inheritall="false" inheritrefs="false" />
-    </target>
-    
-</project>
diff --git a/sigil/ivy/resolver/example/dependence/dependee/build.xml b/sigil/ivy/resolver/example/dependence/dependee/build.xml
deleted file mode 100644
index c2c124b..0000000
--- a/sigil/ivy/resolver/example/dependence/dependee/build.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="dependee" default="run" xmlns:ivy="antlib:org.apache.ivy.ant">
-    <!-- some variables used -->
-    <property name="lib.dir" value="${basedir}/lib" />
-    <property name="build.dir" value="${basedir}/build" />
-    <property name="classes.dir" value="${build.dir}/classes" />
-    <property name="src.dir" value="${basedir}/src" />
-
-    <!-- ivy properties used -->
-    <property name="ivy.settings.dir" value="../settings" />
-    <property file="${ivy.settings.dir}/ivysettings.properties" />
-    
-    <!-- paths used for compilation and run  -->
-    <path id="lib.path.id">
-        <fileset dir="${lib.dir}" />
-	</path>
-    <path id="run.path.id">
-        <path refid="lib.path.id" />
-        <path location="${classes.dir}" />
-    </path>
-    
-    <!-- ================================= 
-          target: init
-         ================================= -->
-    <target name="init">
-	<taskdef resource="org/apache/ivy/ant/antlib.xml"
-		 uri="antlib:org.apache.ivy.ant"
-		 classpath="${ivy.jar}"/>
-
-	<ivy:settings file="${ivy.settings.dir}/ivysettings.xml" />
-
-        <taskdef name="sigil.bundle"
-          classname="org.apache.felix.sigil.ant.BundleTask"
-          classpath="${sigil-ivy-plugin.jar}"/>
-    </target>
-
-    <!-- ================================= 
-          target: resolve              
-         ================================= -->
-    <target name="resolve" depends="init"
-    	description="--> resolve and retrieve dependencies with ivy">
-        <ivy:retrieve />
-    </target>
-        
-    <!-- ================================= 
-          target: report              
-         ================================= -->
-    <target name="report" depends="resolve" description="--> generates a report of dependencies">
-        <ivy:report todir="${build.dir}"/>
-    </target>
-	
-    <!-- ================================= 
-          target: compile              
-         ================================= -->
-    <target name="compile" depends="resolve" description="--> description">
-        <mkdir dir="${classes.dir}" />
-        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="lib.path.id" />
-    </target>
-    
-    <!-- ================================= 
-          target: run
-         ================================= -->
-    <target name="run" depends="compile" description="--> compile and run the project">
-        <java classpathref="run.path.id" classname="standalone.Main"/>
-    </target>
-    
-    <!-- ================================= 
-          target: jar              
-         ================================= -->
-    <target name="jar" depends="compile" description="--> make a jar file for this project">
-        <propertyfile file="${classes.dir}/version.properties">
-	        <entry  key="version" type="int" operation="+" default="0" />
-		</propertyfile>
-        <property file="${classes.dir}/version.properties" />
-	<!--
-        <jar destfile="${build.dir}/${ant.project.name}.jar">
-            <fileset dir="${classes.dir}" />
-        </jar>
-	-->
-	<sigil.bundle destpattern="${build.dir}/[id].[ext]"
-		      classpathref="run.path.id" />
-    </target>
-
-    <!-- ================================= 
-          target: publish              
-         ================================= -->
-    <target name="publish" depends="jar" description="--> publish this project in the ivy repository">
-        <property name="revision" value="${version}"/>
-        <delete file="${build.dir}/ivy.xml"/>
-		<ivy:publish artifactspattern="${build.dir}/[artifact].[ext]" 
-			resolver="projects"
-			pubrevision="${revision}" 
-			status="release"
-		/>
-        <echo message="project ${ant.project.name} released with version ${revision}" />
-    </target>
-
-
-    <!-- ================================= 
-          target: clean              
-         ================================= -->
-    <target name="clean" description="--> clean the project">
-        <delete includeemptydirs="true">
-            <fileset dir="${basedir}">
-            	<exclude name="src/**" />
-            	<exclude name="build.xml" />
-		<exclude name="ivy.xml" />
-		<exclude name="sigil.properties" />
-	    </fileset>
-    	</delete>
-    </target>
-</project>
diff --git a/sigil/ivy/resolver/example/dependence/dependee/ivy.xml b/sigil/ivy/resolver/example/dependence/dependee/ivy.xml
deleted file mode 100644
index 631338a..0000000
--- a/sigil/ivy/resolver/example/dependence/dependee/ivy.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info organisation="org.apache" module="dependee"/>
-    <dependencies>
-        <dependency org="commons-lang" name="commons-lang" rev="2.0"/>
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/example/dependence/dependee/sigil.properties b/sigil/ivy/resolver/example/dependence/dependee/sigil.properties
deleted file mode 100644
index 619a841..0000000
--- a/sigil/ivy/resolver/example/dependence/dependee/sigil.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-# dependee sigil.properties
-
-version: 1.0.0
-
--bundles: dependee
-
--exports: standalone
-
--imports: \
-  org.apache.commons.lang;version="[2.0.0,2.4.0)", \
-
-# add these to -imports to test the resolution process
-#  javax.servlet;version="(2.4,3.0]", \
-#  org.apache.log4j;version="[1.2.14,1.3)", \
-#  org.apache.commons.logging, \
-
-# this is a require-bundle dependency
-#-requires: \
-#  com.springsource.org.apache.commons.lang;version="[2.0.0,2.4.0)", \
-
--resources: \
-  version.properties
-
-# end
diff --git a/sigil/ivy/resolver/example/dependence/dependee/src/standalone/Main.java b/sigil/ivy/resolver/example/dependence/dependee/src/standalone/Main.java
deleted file mode 100644
index 1b7398c..0000000
--- a/sigil/ivy/resolver/example/dependence/dependee/src/standalone/Main.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package standalone;
-
-import java.util.Properties;
-
-import org.apache.commons.lang.WordUtils;
-
-/**
- * TODO write javadoc
- */
-public final class Main {
-    /**
-     * Returns the version of the project
-     * @return a string representation of the version, null if the version could not be retreived
-     */
-    public static String getVersion() {
-        Properties p = new Properties();
-        try {
-            p.load(Main.class.getResourceAsStream("/version.properties"));
-            String version = p.getProperty("version");
-            if (version != null) {
-                return String.valueOf(Integer.parseInt(version));
-            } 
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-    
-    /**
-     * Return the same string with all words capitalized.
-     * @param str the string conatining the words to capitalize
-     * @return null if the string was null, the string with all words capitalized otherwise
-     */
-    public static String capitalizeWords(String str) {
-        System.out.println("    [" + Main.class.getName() + "] capitalizing string \"" 
-            + str + "\" using " + WordUtils.class.getName());
-        return WordUtils.capitalizeFully(str);
-    }
-    public static void main(String[] args) {
-        String message = "sentence to capitalize";
-        System.out.println("standard message : " + message);
-        System.out.println("capitalized message : " + capitalizeWords(message));
-    }
-    
-    private Main() {
-    }
-}
diff --git a/sigil/ivy/resolver/example/dependence/depender/build.xml b/sigil/ivy/resolver/example/dependence/depender/build.xml
deleted file mode 100644
index aebdb1c..0000000
--- a/sigil/ivy/resolver/example/dependence/depender/build.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="depender" default="run" xmlns:ivy="antlib:org.apache.ivy.ant">
-    <!-- some variables used -->
-    <property name="lib.dir" value="${basedir}/lib" />
-    <property name="build.dir" value="${basedir}/build" />
-    <property name="classes.dir" value="${build.dir}/classes" />
-    <property name="src.dir" value="${basedir}/src" />
-
-    <!-- ivy properties used -->
-    <property name="ivy.settings.dir" value="../settings" />
-    <property file="${ivy.settings.dir}/ivysettings.properties" />
-    
-    <!-- paths used for compilation and run  -->
-    <path id="lib.path.id">
-        <fileset dir="${lib.dir}" />
-	</path>
-    <path id="run.path.id">
-        <path refid="lib.path.id" />
-        <path location="${classes.dir}" />
-    </path>
-
-    <!-- ================================= 
-          target: init
-         ================================= -->
-    <target name="init">
-	<taskdef resource="org/apache/ivy/ant/antlib.xml"
-		 uri="antlib:org.apache.ivy.ant"
-		 classpath="${ivy.jar}"/>
-
-	<ivy:settings file="${ivy.settings.dir}/ivysettings.xml" />
-
-        <taskdef name="sigil.bundle"
-          classname="org.apache.felix.sigil.ant.BundleTask"
-          classpath="${sigil-ivy-plugin.jar}"/>
-    </target>
-
-    
-    <!-- ================================= 
-          target: resolve              
-         ================================= -->
-    <target name="resolve" depends="init"
-    	description="--> resolve and retrieve dependencies with ivy">
-        <ivy:retrieve />
-    </target>
-    
-    <!-- ================================= 
-          target: report              
-         ================================= -->
-    <target name="report" depends="resolve" description="--> generates a report of dependencies">
-        <ivy:report todir="${build.dir}" dot="true"/>
-    </target>
-    
-    <!-- ================================= 
-          target: gen-graph
-         ================================= -->
-    <target name="gen-graph" depends="report" description="--> generates a graph of dependencies (requires dot in your path - see http://www.graphviz.org/)">
-    	<property name="dot.file" value="${build.dir}/apache-depending-default.dot" />
-    	<property name="ivygraph.output.file" value="${build.dir}/graph.png" />
-    	<exec executable="dot">
-    	    <arg line="-T png -o ${ivygraph.output.file} ${dot.file}" />
-    	</exec>
-    </target>
-    
-    <!-- ================================= 
-          target: compile              
-         ================================= -->
-    <target name="compile" depends="resolve" description="--> description">
-        <mkdir dir="${classes.dir}" />
-        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="lib.path.id" />
-    </target>
-    
-    <!-- ================================= 
-          target: run
-         ================================= -->
-    <target name="run" depends="clean, compile" description="--> compile and run the project">
-        <java classpathref="run.path.id" classname="depending.Main"/>
-    </target>
-    
-    <!-- ================================= 
-          target: clean              
-         ================================= -->
-    <target name="clean" description="--> clean the project">
-        <delete includeemptydirs="true">
-            <fileset dir="${basedir}">
-            	<exclude name="src/**" />
-            	<exclude name="build.xml" />
-		<exclude name="ivy.xml" />
-		<exclude name="sigil.properties" />
-	    </fileset>
-    	</delete>
-    </target>
-</project>
diff --git a/sigil/ivy/resolver/example/dependence/depender/ivy.xml b/sigil/ivy/resolver/example/dependence/depender/ivy.xml
deleted file mode 100644
index d8031f3..0000000
--- a/sigil/ivy/resolver/example/dependence/depender/ivy.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info organisation="org.apache" module="depender"/>
-    <dependencies>
-        <dependency name="dependee" rev="latest.integration" />
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/example/dependence/depender/sigil.properties b/sigil/ivy/resolver/example/dependence/depender/sigil.properties
deleted file mode 100644
index e76ec83..0000000
--- a/sigil/ivy/resolver/example/dependence/depender/sigil.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-# depender sigil.properties
-
--bundles: depender
-
--imports: standalone
-
-# end
diff --git a/sigil/ivy/resolver/example/dependence/depender/src/depending/Main.java b/sigil/ivy/resolver/example/dependence/depender/src/depending/Main.java
deleted file mode 100644
index 59b0399..0000000
--- a/sigil/ivy/resolver/example/dependence/depender/src/depending/Main.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package depending;
-
-/**
- * TODO write javadoc
- */
-public final class Main {
-    public static void main(String[] args) {
-        String standaloneVersion = standalone.Main.getVersion();
-        if (standaloneVersion != null) {
-            System.out.println("you are using version " + standaloneVersion 
-                + " of class " + standalone.Main.class.getName());
-        } else {
-            System.err.println("failed to get version of " + standalone.Main.class.getName());
-        }
-        String message = "i am " + Main.class.getName() 
-            + " and " + standalone.Main.class.getName() + " will do the job for me";
-        System.out.println("standard message : " + message);
-        System.out.println("capitalized message : " + standalone.Main.capitalizeWords(message));
-    }
-    
-    private Main() {
-    }
-}
diff --git a/sigil/ivy/resolver/example/dependence/settings/ivysettings.properties b/sigil/ivy/resolver/example/dependence/settings/ivysettings.properties
deleted file mode 100644
index 737733c..0000000
--- a/sigil/ivy/resolver/example/dependence/settings/ivysettings.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-repository.dir=${ivy.settings.dir}/repository
-sigil-ivy-plugin.jar=${ivy.settings.dir}/../../../lib/sigil-ivy-plugin.jar
-ivy.jar=/opt/apache-ivy-2.0.0-rc2/ivy-2.0.0-rc2.jar
diff --git a/sigil/ivy/resolver/example/dependence/settings/ivysettings.xml b/sigil/ivy/resolver/example/dependence/settings/ivysettings.xml
deleted file mode 100644
index ee0ff48..0000000
--- a/sigil/ivy/resolver/example/dependence/settings/ivysettings.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivysettings>
-    <properties file="${ivy.settings.dir}/ivysettings.properties"/>
-    <settings defaultResolver="projects"/>
-    <caches defaultCacheDir="${ivy.settings.dir}/ivy-cache" />
-
-    <classpath file="${sigil-ivy-plugin.jar}" />
-    <typedef name="sigil-parser" classname="org.apache.felix.sigil.ivy.SigilParser" />
-    <typedef name="sigil-resolver" classname="org.apache.felix.sigil.ivy.SigilResolver" />
-
-    <parsers>
-	<sigil-parser/>
-    </parsers>
-
-    <resolvers>
-	<sigil-resolver name="sigil" config="${ivy.settings.dir}/sigil-repos.properties" />
-        <filesystem name="projects">
-            <artifact pattern="${repository.dir}/[artifact]-[revision].[ext]" />
-            <ivy pattern="${repository.dir}/[module]-[revision].xml" />
-        </filesystem>
-        <!--
-        <ibiblio name="libraries" m2compatible="true" usepoms="false" />
-        -->
-    </resolvers>
-    <modules>
-        <module organisation="sigil" name="*" resolver="sigil"/>
-    </modules>
-</ivysettings>
diff --git a/sigil/ivy/resolver/example/dependence/settings/sigil-repos.properties b/sigil/ivy/resolver/example/dependence/settings/sigil-repos.properties
deleted file mode 100644
index 85150e2..0000000
--- a/sigil/ivy/resolver/example/dependence/settings/sigil-repos.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# repository config
-
--repositories:	system, project, spring
-
-system;provider:	system
-system;level:		-1
-
-project;provider:	project
-project;level:	0
-project;pattern:	../*/[sigilproject]
-
-spring;provider:	obr
-spring;level:		2
-spring;url:		http://sigil.codecauldron.org/spring-external.obr
-spring;index:		../settings/spring-external.obr
-
-# end
diff --git a/sigil/ivy/resolver/example/felix-log/README b/sigil/ivy/resolver/example/felix-log/README
deleted file mode 100644
index df71d9b..0000000
--- a/sigil/ivy/resolver/example/felix-log/README
+++ /dev/null
@@ -1,22 +0,0 @@
-# http://sigil.codecauldron.org
-
-This example shows how to build the felix log service, using Ant/Ivy,
-instead of Maven.
-
-sigil.properties has been constructed to produce an identical bundle to the
-one produced by Maven.
-
-The Felix dependencies are obtained from an OBR index of
-http://repo1.maven.org/maven2/org/apache/felix, Maven repos can't be searched
-directly for package import dependencies.
-
-1. checkout felix log code
-  $ cd felix-log
-  $ svn co http://svn.apache.org/repos/asf/felix/trunk/log
-
-2. set ivy.jar location in common/build.properties
-
-3. build
-  $ cd log
-  $ ant
-
diff --git a/sigil/ivy/resolver/example/felix-log/bldcommon/build.properties b/sigil/ivy/resolver/example/felix-log/bldcommon/build.properties
deleted file mode 100644
index ff1bcc1..0000000
--- a/sigil/ivy/resolver/example/felix-log/bldcommon/build.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-# common properties
-
-# CHANGE ivy.jar TO REFLECT YOUR INSTALLATION
-ivy.jar = /opt/apache-ivy-2.0.0-rc2/ivy-2.0.0-rc2.jar
-
-sigil-ivy-plugin.jar = ${common.dir}/../../../lib/sigil-ivy-plugin.jar
-
-build.dir	= ${basedir}/build
-classes.dir	= ${build.dir}/classes
-deps.dir	= ${build.dir}/deps
-resource.dir	= ${basedir}/xml
-src.dir		= ${basedir}/src
-
-dest.dir	= ${build.dir}
-dest.lib.dir	= ${dest.dir}/lib
-dest.etc.dir	= ${dest.dir}/etc
-
-ivy.file	= ${basedir}/ivy.xml
-module.version.target = 1.0
-
-cache.dir	= ${common.dir}/ivy-cache
-repository.dir	= ${common.dir}/repository
-
-example.version	= 1.0.0
-bundle.version	= ${example.version}
-
diff --git a/sigil/ivy/resolver/example/felix-log/bldcommon/common.xml b/sigil/ivy/resolver/example/felix-log/bldcommon/common.xml
deleted file mode 100644
index aedc2ec..0000000
--- a/sigil/ivy/resolver/example/felix-log/bldcommon/common.xml
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="common" 
-         xmlns:ivy="antlib:org.apache.ivy.ant">
-    
-    <dirname property="common.dir" file="${ant.file.common}"/>
-    <property file="${common.dir}/build.properties"/>
-
-    <path id="lib.path.id">
-        <fileset dir="${deps.dir}" />
-    </path>
-
-    <path id="sigil.path.id">
-        <path refid="lib.path.id" />
-        <path location="${classes.dir}" />
-    </path>
-
-    <!-- setup ivy default configuration with some custom info -->
-    <property name="ivy.local.default.root" value="${repository.dir}/local"/>
-    <property name="ivy.shared.default.root" value="${repository.dir}/shared"/>
-
-    <!-- ================================= 
-          target: load-ivy
-         ================================= -->
-    <target name="load-ivy" depends="ivy-taskdefs">
-	<ivy:settings file="${common.dir}/ivysettings.xml" />
-    </target>
-
-    <!-- ================================= 
-          target: ivy-taskdefs
-         ================================= -->
-    <target name="ivy-taskdefs" unless="ivy.loaded">
-    	<property name="ivy.loaded" value="true"/>
-	<echo message="Loading Ivy ... common.dir=${common.dir}"/>
-
-    	<taskdef resource="org/apache/ivy/ant/antlib.xml"
-    	         uri="antlib:org.apache.ivy.ant"
-		 classpath="${ivy.jar}"/>
-
-	<taskdef name="sigil.bundle"
-		 classname="oorg.apache.felix.sigil.ant.BundleTask"
-		 classpath="${sigil-ivy-plugin.jar}"/>
-    </target>    
-
-
-
-    <!-- ================================= 
-          target: build (default target)
-         ================================= -->
-    <target name="build" depends="ident, jar, resources" />
-
-    <target name="ident">
-      <echo message="${ant.project.name}"/>
-    </target>
-
-    <!-- ================================= 
-          target: resolve              
-         ================================= -->
-    <target name="resolve" depends="load-ivy, clean-deps"
-    	description="--> resolve and retrieve dependencies with ivy">
-	<mkdir dir="${deps.dir}"/>
-    	<ivy:resolve file="${ivy.file}"/>
-    	<ivy:retrieve pattern="${deps.dir}/[artifact].[ext]" />
-    </target>
-
-    <!-- ================================= 
-          target: install
-         ================================= -->
-    <target name="install" depends="install-version, build"
-    	description="--> publish this project in the local repository">
-    	<ivy:publish artifactspattern="${dest.lib.dir}/[artifact].[ext]" 
-		       resolver="local"
-		       pubrevision="${version}" 
-		       pubdate="${now}"
-		       forcedeliver="true"
-		       status="integration"/>
-        <echo message="project ${ant.project.name} published locally with version ${version}" />
-    </target>
-
-    <target name="install-version">
-	<tstamp>
-	    <format property="now" pattern="yyyyMMddHHmmss"/>
-	</tstamp>
-        <property name="version"
-	      value="${module.version.target}-local-${now}"/>
-    </target>
-    
-    <!-- ================================= 
-          target: report              
-         ================================= -->
-    <target name="report" depends="resolve"
-    	description="--> generates a report of dependencies">
-        <ivy:report todir="${build.dir}"/>
-    </target>
-    
-    <!-- ================================= 
-          target: compile              
-         ================================= -->
-    <target name="compile" depends="resolve"
-    	description="--> compile the project">
-        <mkdir dir="${classes.dir}" />
-        <javac srcdir="${src.dir}"
-		destdir="${classes.dir}"
-		classpathref="lib.path.id"
-		target="1.5"
-		debug="true" />
-    </target>
-    
-    <!-- ================================= 
-          target: jar              
-         ================================= -->
-    <target name="jar" depends="compile"
-    	description="--> make a jar file for this project">
-	<mkdir dir="${dest.lib.dir}"/>
-        <sigil.bundle destpattern="${dest.lib.dir}/[id].[ext]"
-                classpathref="sigil.path.id"/>
-    </target>
-
-    <!-- ================================= 
-          target: resources              
-         ================================= -->
-    <available file="${resource.dir}" type="dir"
-               property="resource.dir.present"/>
-
-    <target name="resources" if="resource.dir.present"
-    	description="--> filter xml resources replacing ${VERSION} etc.">
-	<mkdir dir="${dest.etc.dir}"/>
-	<copy todir="${dest.etc.dir}">
-	  <fileset dir="${resource.dir}">
-	    <include name="*.composite"/>
-	    <include name="*.system"/>
-	  </fileset>
-	  <filterset begintoken="$${" endtoken="}">
-	    <filter token="VERSION" value="${bundle.version}"/>
-	    <filter token="BLITZ_VERSION" value="${blitz.version}"/>
-	    <filter token="JINI_VERSION" value="${jini.version}"/>
-	  </filterset>
-	</copy>
-    </target>
-
-    <!-- ================================= 
-      target: clean-local              
-     ================================= -->
-    <target name="clean-local"
-    	description="--> cleans the local repository for the current module">
-       <delete dir="${ivy.local.default.root}/${ant.project.name}"/>
-    </target>
-
-    <!-- ================================= 
-      target: clean-deps              
-     ================================= -->
-    <target name="clean-deps"
-    	description="--> clean the project libraries directory (dependencies)">
-	<delete includeemptydirs="true" dir="${deps.dir}"/>
-    </target>
-
-    <!-- ================================= 
-          target: clean-build              
-         ================================= -->
-    <target name="clean-build"
-    	description="--> clean the project built files">
-        <delete includeemptydirs="true" dir="${build.dir}"/>
-    </target>
-
-    <!-- ================================= 
-          target: clean              
-         ================================= -->
-    <target name="clean" depends="clean-build, clean-deps"
-    	description="--> clean the project" />
-
-
-    <!-- ================================= 
-          target: buildlist
-         ================================= -->
-    <fileset id="projects" dir="${basedir}" includes="**/build.xml"/>
-
-    <target name="buildlist" depends="load-ivy">
-      <ivy:buildlist reference="ordered-list"
-		  onMissingDescriptor="skip">
-	<fileset refid="projects"/>
-      </ivy:buildlist>
-    </target>
-
-    <!-- ================================= 
-          target: install-list
-         ================================= -->
-    <target name="install-list" depends="buildlist" 
-	  description="--> compile, jar and install all projects in the right order">
-      <subant target="install" buildpathref="ordered-list">
-	<propertyset>
-	  <propertyref name="ivy.loaded" />
-	</propertyset>
-      </subant>
-    </target>
-
-    <!-- ================================= 
-          target: clean-list
-         ================================= -->
-    <target name="clean-list" depends="clean, buildlist"
-	  description="--> clean all projects">
-      <subant target="clean" buildpathref="ordered-list" />
-    </target>
-
-    <!-- ================================= 
-          target: clean-all
-         ================================= -->
-    <target name="clean-all" depends="clean-list" 
-    description="--> delete repository, ivy cache, and all projects">
-      <delete dir="${repository.dir}"/>
-      <ivy:cleancache />
-    </target>
-
-</project>
diff --git a/sigil/ivy/resolver/example/felix-log/bldcommon/ivysettings.xml b/sigil/ivy/resolver/example/felix-log/bldcommon/ivysettings.xml
deleted file mode 100644
index a1fb903..0000000
--- a/sigil/ivy/resolver/example/felix-log/bldcommon/ivysettings.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivysettings>
-  <properties file="${ivy.settings.dir}/build.properties"/>
-  <caches defaultCacheDir="${cache.dir}" />
-
-  <settings defaultResolver="local" circularDependencyStrategy="error" />
-
-  <classpath file="${sigil-ivy-plugin.jar}" />
-  <typedef name="sigil-parser" classname="org.apache.felix.sigil.ivy.SigilParser" />
-  <typedef name="sigil" classname="org.apache.felix.sigil.ivy.SigilResolver" />
-
-  <parsers>
-    <sigil-parser config="${ivy.settings.dir}/sigil-repos.properties"
-    		quiet="true"/>
-  </parsers>
-
-  <resolvers>
-    <sigil name="sigil"
-	   config="${ivy.settings.dir}/sigil-repos.properties"
-	   extractBCP="true"/>
-
-    <filesystem name="local">
-      <ivy pattern="${repository.dir}/local/[module]-[revision].xml" />
-      <artifact pattern="${repository.dir}/local/[artifact]-[revision].[ext]" />
-    </filesystem>
-
-    <filesystem name="shared">
-      <ivy pattern="${repository.dir}/shared/[module]-[revision].xml" />
-      <artifact pattern="${repository.dir}/shared/[module]/[artifact]-[revision].[ext]" />
-    </filesystem>
-  </resolvers>
-
-  <modules>
-    <module organisation="sigil" resolver="sigil"/>
-  </modules>
-</ivysettings>
diff --git a/sigil/ivy/resolver/example/felix-log/bldcommon/sigil-repos.properties b/sigil/ivy/resolver/example/felix-log/bldcommon/sigil-repos.properties
deleted file mode 100644
index fbc95c6..0000000
--- a/sigil/ivy/resolver/example/felix-log/bldcommon/sigil-repos.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# sigil repository config
-
--repositories:	system, project, felix
-
-system;provider:	system
-system;level:		-1
-
-project;provider:	project
-project;level:		0
-project;pattern:	../*/[sigilproject]
-
-felix;provider:         obr
-felix;level:            1
-felix;url:              http://sigil.codecauldron.org/maven-felix.obr
-felix;index:            ../bldcommon/maven-felix.obr
-
-# end
diff --git a/sigil/ivy/resolver/example/felix-log/log/build.xml b/sigil/ivy/resolver/example/felix-log/log/build.xml
deleted file mode 100644
index c7c19f6..0000000
--- a/sigil/ivy/resolver/example/felix-log/log/build.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="felix-log" default="build">
-      <import file="../bldcommon/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/example/felix-log/log/ivy.xml b/sigil/ivy/resolver/example/felix-log/log/ivy.xml
deleted file mode 100644
index 6e0b4db..0000000
--- a/sigil/ivy/resolver/example/felix-log/log/ivy.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.felix"
-        module="felix-log"
-        status="integration"/>
-</ivy-module>
diff --git a/sigil/ivy/resolver/example/felix-log/log/sigil.properties b/sigil/ivy/resolver/example/felix-log/log/sigil.properties
deleted file mode 100644
index 3443218..0000000
--- a/sigil/ivy/resolver/example/felix-log/log/sigil.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-# sigil project file, saved by plugin.
-
--activator: ${Bundle-SymbolicName}.impl.Activator
-
-name: org.apache.felix.log
-
-version: 0.9.0.SNAPSHOT
-
--bundles: \
-	felix-log, \
-
--contents: \
-	${Bundle-SymbolicName}.impl, \
-	org.osgi.service.log, \
-
--resources: \
-	=src/main/resources, \
-
--sourcedirs: \
-	src/main/java, \
-
--exports: \
-	org.osgi.service.log, \
-
--imports: \
-	org.osgi.framework;version=1.4, \
-	org.osgi.service.log;version=1.3, \
-
-header;Bundle-Vendor: The Apache Software Foundation
-
-header;Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
-
-header;Export-Service: org.osgi.service.log.LogService,org.osgi.service.log.LogReaderService
-
-header;Bundle-Name: Apache Felix Log Service
-
-header;Bundle-DocURL: http://www.apache.org/
-
diff --git a/sigil/ivy/resolver/example/multi-project/README b/sigil/ivy/resolver/example/multi-project/README
deleted file mode 100644
index ed39dc3..0000000
--- a/sigil/ivy/resolver/example/multi-project/README
+++ /dev/null
@@ -1,19 +0,0 @@
-# http://sigil.codecauldron.org
-
-This example is based on the Ivy Tutorial multi-project example:
-http://ant.apache.org/ivy/history/latest-milestone/tutorial/multiproject.html
-
-Dependencies are resolved using an OBR index for the Spring repository,
-hosted at sigil.codecauldron.org.
-
-projects/sigil-defaults.properties specifies default package version ranges,
-which are inherited by the -imports in sigil.properties.
-
-1. set ivy.jar location in common/build.properties
-
-2. test build order (determined automatically from the dependencies)
-$ ant order
-
-3. build
-$ ant publish
-
diff --git a/sigil/ivy/resolver/example/multi-project/build.xml b/sigil/ivy/resolver/example/multi-project/build.xml
deleted file mode 100644
index a04ef74..0000000
--- a/sigil/ivy/resolver/example/multi-project/build.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="all" default="publish" xmlns:ivy="antlib:org.apache.ivy.ant">
-  <property name="common.dir" value="${basedir}/common" />
-  <import file="${common.dir}/common.xml"/>
-
-  <fileset id="projects" dir="projects" includes="**/build.xml"/>
-
-  <path id="unordered-list">
-    <fileset refid="projects"/>
-  </path>
-
-  <target name="buildlist" depends="load-ivy"> 
-    <ivy:buildlist reference="ordered-list">
-      <fileset refid="projects"/>
-    </ivy:buildlist>
-  </target>
-  
-  <target name="publish" depends="buildlist" 
-	description="compile, jar and publish all projects in the right order">
-    <subant target="publish" buildpathref="ordered-list">
-      <propertyset>
-	<propertyref name="ivy.loaded" />
-      </propertyset>
-    </subant>
-  </target>
-
-  <target name="clean" description="clean all projects">
-    <subant target="clean" buildpathref="unordered-list" />
-  </target>
-  
-  <target name="fullclean" depends="clean, load-ivy" 
-  description="clean tutorial: delete repository, ivy cache, and all projects">
-    <delete dir="repository"/>
-  	<ivy:cleancache />
-  </target>
-
-  <target name="order" depends="buildlist"
-      description="test buildlist order">
-    <subant target="hello" buildpathref="ordered-list" />
-  </target>
-
-</project>
diff --git a/sigil/ivy/resolver/example/multi-project/common/build.properties b/sigil/ivy/resolver/example/multi-project/common/build.properties
deleted file mode 100644
index 79298b4..0000000
--- a/sigil/ivy/resolver/example/multi-project/common/build.properties
+++ /dev/null
@@ -1,36 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-
-# CHANGE ivy.jar TO REFLECT YOUR INSTALLATION
-ivy.jar = /opt/apache-ivy-2.0.0-rc2/ivy-2.0.0-rc2.jar
-
-sigil-ivy-plugin.jar = ${common.dir}/../../../lib/sigil-ivy-plugin.jar
-
-lib.dir = ${basedir}/lib
-build.dir = ${basedir}/build
-classes.dir = ${build.dir}/classes
-src.dir = ${basedir}/src
-repository.dir=${common.dir}/../repository
-
-ivy.file = ${basedir}/ivy.xml
-
-jar.file = ${build.dir}/${ant.project.name}.jar
-main.class.name = ${ant.project.name}.Main
-
-module.version.target = 1.0
diff --git a/sigil/ivy/resolver/example/multi-project/common/common.xml b/sigil/ivy/resolver/example/multi-project/common/common.xml
deleted file mode 100644
index 311cffd..0000000
--- a/sigil/ivy/resolver/example/multi-project/common/common.xml
+++ /dev/null
@@ -1,218 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="common" 
-         xmlns:ivy="antlib:org.apache.ivy.ant">
-	<!-- a sample common ant build file, used for ivy multi-project tutorial
-	     feel free to copy and adapt it to your own needs
-	     Note that the only targets specific to ivy are:
-	        load-ivy
-	     	resolve
-	     	report
-	     	ivy-new-version
-	     	publish
-	     	publish-local
-	     	
-	     All other targets are usual ant based targets, which could have been written
-	     in a build not depending at all on ivy: 
-	     resolve constructs a lib directory based upon ivy dependencies, and then the lib dir 
-	     is used as in any classical ant build
-	     -->
-	
-	<property file="${common.dir}/build.properties"/>
-	
-	<!-- ================================= 
-          target: load-ivy         
-            this target is not necessary if you put ivy.jar in your ant lib directory
-            if you already have ivy 2.0 in your ant lib, you can simply remove this
-            target
-         ================================= -->
-
-    <target name="load-ivy" depends="ivy-taskdefs">
-	<ivy:settings file="${common.dir}/ivysettings.xml" />
-    </target>
-
-    <target name="ivy-taskdefs" unless="ivy.loaded">
-    	<property name="ivy.loaded" value="true"/>
-	<echo message="Loading Ivy ..."/>
-    	<taskdef resource="org/apache/ivy/ant/antlib.xml"
-    	         uri="antlib:org.apache.ivy.ant"
-		 classpath="${ivy.jar}"/>
-
-	<taskdef name="sigil.bundle"
-		 classname="org.apache.felix.sigil.ant.BundleTask"
-		 classpath="${sigil-ivy-plugin.jar}"/>
-    </target>    
-
-    <path id="lib.path.id">
-        <fileset dir="${lib.dir}" />
-    </path>
-
-    <path id="run.path.id">
-        <path refid="lib.path.id" />
-        <path location="${classes.dir}" />
-    </path>
-
-    
-    <!-- setup ivy default configuration with some custom info -->
-    <property name="ivy.local.default.root" value="${repository.dir}/local"/>
-    <property name="ivy.shared.default.root" value="${repository.dir}/shared"/>
-
-    <!-- here is how we would have configured ivy if we had our own ivysettings file
-    <ivy:settings file="${common.dir}/ivysettings.xml" />
-    -->
-
-    <!-- ================================= 
-          target: hello              
-         ================================= -->
-    <target name="hello" description="--> identify project (useful to test buildlist)">
-	<echo message="${ant.project.name}"/>
-    </target>
-	
-    <!-- ================================= 
-          target: resolve              
-         ================================= -->
-    <target name="resolve" depends="clean-lib, load-ivy" description="--> resolve and retrieve dependencies with ivy">
-        <mkdir dir="${lib.dir}"/> <!-- not usually necessary, ivy creates the directory IF there are dependencies -->
-    	
-    	<!-- the call to resolve is not mandatory, retrieve makes an implicit call if we don't -->
-    	<ivy:resolve file="${ivy.file}"/>
-    	<ivy:retrieve pattern="${lib.dir}/[artifact].[ext]" />
-    </target>
-    
-    <!-- ================================= 
-          target: report              
-         ================================= -->
-    <target name="report" depends="resolve" description="--> generates a report of dependencies">
-        <ivy:report todir="${build.dir}"/>
-    </target>
-    
-    <!-- ================================= 
-          target: compile              
-         ================================= -->
-    <target name="compile" depends="resolve" description="--> compile the project">
-        <mkdir dir="${classes.dir}" />
-        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="lib.path.id" debug="true" />
-    </target>
-    
-    <!-- ================================= 
-          target: run
-         ================================= -->
-    <target name="run" depends="version, compile" description="--> compile and run the project">
-        <java classpathref="run.path.id" classname="${main.class.name}"/>
-    </target>
-
-	<target name="ivy-new-version" depends="load-ivy" unless="ivy.new.revision">
-    	<!-- default module version prefix value -->
-		<property name="module.version.prefix" value="${module.version.target}-dev-b" />
-		
-    	<!-- asks to ivy an available version number -->
-		<ivy:info file="${ivy.file}" />
-    	<ivy:buildnumber 
-    		organisation="${ivy.organisation}" module="${ivy.module}" 
-    		revision="${module.version.prefix}" defaultBuildNumber="1" revSep=""/>
-	</target>
-
-    <target name="local-version">
-		<tstamp>
-			<format property="now" pattern="yyyyMMddHHmmss"/>
-		</tstamp>
-        <property name="ivy.new.revision" value="${module.version.target}-local-${now}"/>
-    </target>
-	
-	<target name="version" depends="ivy-new-version">
-    	<!-- create version file in classpath for later inclusion in jar -->
-        <mkdir dir="${classes.dir}"/>
-		<echo message="version=${ivy.new.revision}" file="${classes.dir}/${ant.project.name}.properties" append="false" />
-
-		<!-- load generated version properties file -->
-        <property file="${classes.dir}/${ant.project.name}.properties" />
-    </target>
-
-    <!-- ================================= 
-          target: jar              
-         ================================= -->
-    <target name="jar" depends="version, compile" description="--> make a jar file for this project">
-
-	<!--
-        <jar destfile="${jar.file}">
-            <fileset dir="${classes.dir}" />
-            <manifest>
-                <attribute name="Built-By" value="${user.name}"/>
-                <attribute name="Build-Version" value="${version}" />
-            </manifest>
-        </jar>
-	-->
-
-        <sigil.bundle destpattern="${build.dir}/[id].[ext]"
-                classpathref="run.path.id"/>
-    </target>
-
-    <!-- ================================= 
-          target: publish              
-         ================================= -->
-    <target name="publish" depends="clean-build, jar" description="--> publish this project in the ivy repository">
-    	<ivy:publish artifactspattern="${build.dir}/[artifact].[ext]" 
-    			           resolver="shared"
-    			           pubrevision="${version}" 
-    			           status="release"
-    	/>
-        <echo message="project ${ant.project.name} released with version ${version}" />
-    </target>
-
-    <!-- ================================= 
-          target: publish-local              
-         ================================= -->
-    <target name="publish-local" depends="local-version, jar" description="--> publish this project in the local ivy repository">
-    	<ivy:publish artifactspattern="${build.dir}/[artifact].[ext]" 
-    			        resolver="local"
-    			        pubrevision="${version}"
-				        pubdate="${now}"
-    			        status="integration"
-    					forcedeliver="true"
-    	/>
-        <echo message="project ${ant.project.name} published locally with version ${version}" />
-    </target>
-
-	<!-- ================================= 
-          target: clean-local              
-         ================================= -->
-	<target name="clean-local" description="--> cleans the local repository for the current module">
-	   <delete dir="${ivy.local.default.root}/${ant.project.name}"/>
-	</target>
-
-	<!-- ================================= 
-          target: clean-lib              
-         ================================= -->
-    <target name="clean-lib" description="--> clean the project libraries directory (dependencies)">
-        <delete includeemptydirs="true" dir="${lib.dir}"/>
-    </target>
-
-    <!-- ================================= 
-          target: clean-build              
-         ================================= -->
-    <target name="clean-build" description="--> clean the project built files">
-        <delete includeemptydirs="true" dir="${build.dir}"/>
-    </target>
-
-    <!-- ================================= 
-          target: clean              
-         ================================= -->
-    <target name="clean" depends="clean-build, clean-lib" description="--> clean the project" />
-</project>
diff --git a/sigil/ivy/resolver/example/multi-project/common/ivysettings.xml b/sigil/ivy/resolver/example/multi-project/common/ivysettings.xml
deleted file mode 100644
index f2f7454..0000000
--- a/sigil/ivy/resolver/example/multi-project/common/ivysettings.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivysettings>
-  <properties file="${ivy.settings.dir}/build.properties"/>
-  <caches defaultCacheDir="${ivy.settings.dir}/../ivy-cache" />
-
-  <settings defaultResolver="shared" circularDependencyStrategy="error" />
-
-  <classpath file="${ivy.settings.dir}/../../../lib/sigil-ivy-plugin.jar" />
-  <typedef name="sigil-parser" classname="org.apache.felix.sigil.ivy.SigilParser" />
-  <typedef name="sigil-resolver" classname="org.apache.felix.sigil.ivy.SigilResolver" />
-
-  <parsers>
-    <sigil-parser quiet="true"/>
-  </parsers>
-
-  <resolvers>
-    <sigil-resolver name="sigil" config="${ivy.settings.dir}/sigil-repos.properties" />
-    <filesystem name="local">
-      <ivy pattern="${repository.dir}/local/[module]-[revision].xml" />
-      <artifact pattern="${repository.dir}/local/[artifact]-[revision].[ext]" />
-    </filesystem>
-    <filesystem name="shared">
-      <ivy pattern="${repository.dir}/shared/[module]-[revision].xml" />
-      <artifact pattern="${repository.dir}/shared/[module]/[artifact]-[revision].[ext]" />
-    </filesystem>
-  </resolvers>
-  <modules>
-    <!--<module organisation="org.apache.ivy.example" name=".*" resolver="shared"/>
-    -->
-    <module organisation="sigil" resolver="sigil"/>
-  </modules>
-</ivysettings>
diff --git a/sigil/ivy/resolver/example/multi-project/common/sigil-repos.properties b/sigil/ivy/resolver/example/multi-project/common/sigil-repos.properties
deleted file mode 100644
index bd711fa..0000000
--- a/sigil/ivy/resolver/example/multi-project/common/sigil-repos.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-
-# repository config
-
--repositories:	system, project, spring
-
-system;provider:	system
-system;level:		-1
-#system;framework:	osgi.core.jar
-#system;profile:	J2SE-1.5
-
-project;provider:	project
-project;level:	0
-project;pattern:	../projects/**/[sigilproject]
-
-spring;provider:	obr
-spring;level:		2
-spring;url:		http://sigil.codecauldron.org/spring-external.obr
-spring;index:		../common/spring-external.obr
-
-# end
diff --git a/sigil/ivy/resolver/example/multi-project/projects/console/build.properties b/sigil/ivy/resolver/example/multi-project/projects/console/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/console/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/example/multi-project/projects/console/build.xml b/sigil/ivy/resolver/example/multi-project/projects/console/build.xml
deleted file mode 100644
index 5c02cba..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/console/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="console" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/console/ivy.xml b/sigil/ivy/resolver/example/multi-project/projects/console/ivy.xml
deleted file mode 100644
index b1eb4f4..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/console/ivy.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="console"
-        status="integration"/>
-    <dependencies>
-      <dependency name="version" rev="latest.integration" conf="default" />
-      <dependency name="list" rev="latest.integration" conf="default->standalone" />
-      <dependency name="find" rev="latest.integration" conf="default->standalone" />
-      <dependency name="sizewhere" rev="latest.integration" conf="default->standalone" />
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/console/sigil.properties b/sigil/ivy/resolver/example/multi-project/projects/console/sigil.properties
deleted file mode 100644
index dea089f..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/console/sigil.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-
--bundles: console
-
--exports: console
-
--imports: list
diff --git a/sigil/ivy/resolver/example/multi-project/projects/console/src/console/Main.java b/sigil/ivy/resolver/example/multi-project/projects/console/src/console/Main.java
deleted file mode 100644
index 678f3ca..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/console/src/console/Main.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package console;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.util.Collection;
-import java.util.Arrays;
-import java.lang.reflect.Method;
-
-
-public class Main {
-    private static Collection QUIT_COMMANDS = Arrays.asList(new String[] {"quit", "q", "exit"});
-    private static Collection HELP_COMMANDS = Arrays.asList(new String[] {"help", "h", "?"});
-
-    public static void main(String[] a) throws Exception {
-      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
-      while (true) {
-        System.out.print("> ");
-        String command = in.readLine().trim();
-        if (QUIT_COMMANDS.contains(command)) {
-          return;
-        }
-        if (HELP_COMMANDS.contains(command)) {
-          help();
-          continue;
-        }
-        String[] split = command.split(" ");
-        if (split.length == 0) {
-          error(command);
-          continue;
-        }
-        
-        try {
-          String[] args = new String[split.length - 1];
-          System.arraycopy(split, 1, args, 0, args.length);
-          Class cl = Class.forName(split[0]+".Main");
-          Method m = cl.getMethod("main", new Class[] {String[].class});
-          m.invoke(null, new Object[] {args});
-        } catch (Exception ex) {
-          error(command);
-          continue;
-        }
-      }
-    }
-    
-    private static void help() {
-      System.out.println("available commands:");
-      System.out.println("\tquit: quit the console");
-      System.out.println("\thelp: displays this message");
-      System.out.println("\tlist -dir <dir>: list files in given directory");
-      System.out.println("\tfind -dir <dir> -name <name>: list files with given name in given dir");
-      System.out.println("\tsizewhere -dir <dir> -name <name>: compute total size of files with given name in given dir");
-      System.out.println("\thelp: displays this message");
-    }
-            
-    private static void error(String command) {
-      System.out.println("unknown command "+command);
-      System.out.println("type ? for help");
-    }
-            
-}
diff --git a/sigil/ivy/resolver/example/multi-project/projects/find/build.properties b/sigil/ivy/resolver/example/multi-project/projects/find/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/find/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/example/multi-project/projects/find/build.xml b/sigil/ivy/resolver/example/multi-project/projects/find/build.xml
deleted file mode 100644
index 4d23bf5..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/find/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="find" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/find/ivy.xml b/sigil/ivy/resolver/example/multi-project/projects/find/ivy.xml
deleted file mode 100644
index b7f1bc1..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/find/ivy.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="find"
-        status="integration"/>
-    <configurations>
-      <conf name="core"/>
-      <conf name="standalone" extends="core"/>
-    </configurations>
-    <publications>
-      <artifact name="find" type="jar" conf="core" />
-    </publications>
-    <dependencies>
-      <dependency name="version" rev="latest.integration" conf="core->default" />
-      <dependency name="list" rev="latest.integration" conf="core" />
-      <dependency org="commons-collections" name="commons-collections" rev="3.1" conf="core->default" />
-      <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="standalone->default" />
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/find/sigil.properties b/sigil/ivy/resolver/example/multi-project/projects/find/sigil.properties
deleted file mode 100644
index 30c10a7..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/find/sigil.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-
--bundles: find
-
--exports: find
-
--imports:\
-  version, \
-  list, \
-  org.apache.commons.collections, \
-  org.apache.commons.cli
diff --git a/sigil/ivy/resolver/example/multi-project/projects/find/src/find/FindFile.java b/sigil/ivy/resolver/example/multi-project/projects/find/src/find/FindFile.java
deleted file mode 100644
index 25fa1af..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/find/src/find/FindFile.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package find;
-
-import version.Version;
-import list.ListFile;
-
-import java.util.Collection;
-import java.util.ArrayList;
-import java.io.File;
-
-import  org.apache.commons.collections.CollectionUtils;
-import  org.apache.commons.collections.Predicate;
-
-public class FindFile {
-  static {
-    Version.register("find");
-  }
-  
-  public static Collection find(File dir, String name) {
-    return find(ListFile.list(dir), name);
-  }
-  
-  private static Collection find(Collection files, final String name) {    
-    return CollectionUtils.select(files, new Predicate() {
-      public boolean evaluate(Object o) {
-        return ((File)o).getName().indexOf(name) != -1;
-      }
-    });
-  }
-}
diff --git a/sigil/ivy/resolver/example/multi-project/projects/find/src/find/Main.java b/sigil/ivy/resolver/example/multi-project/projects/find/src/find/Main.java
deleted file mode 100644
index a41c136..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/find/src/find/Main.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package find;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.OptionBuilder;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-
-public class Main {
-    private static Options getOptions() {
-        Option dir = OptionBuilder.withArgName("dir")
-            .hasArg()
-            .withDescription("list files in given dir")
-            .create("dir");
-        Option name = OptionBuilder.withArgName("name")
-            .hasArg()
-            .withDescription("list files with given name")
-            .create("name");
-        Options options = new Options();
-
-        options.addOption(dir);
-        options.addOption(name);
-        
-        return options;
-    }
-    
-    public static void main(String[] args) throws Exception {
-        Options options = getOptions();
-        try {
-        
-            CommandLineParser parser = new GnuParser();
-    
-            CommandLine line = parser.parse(options, args);
-            File dir = new File(line.getOptionValue("dir", "."));
-            String name = line.getOptionValue("name", "jar");
-            Collection files = FindFile.find(dir, name);
-            System.out.println("listing files in " + dir + " containing " + name);
-            for (Iterator it = files.iterator(); it.hasNext();) {
-                System.out.println("\t" + it.next() + "\n");
-            }
-        } catch(ParseException exp) {
-            // oops, something went wrong
-            System.err.println("Parsing failed.  Reason: " + exp.getMessage());
-              
-            HelpFormatter formatter = new HelpFormatter();
-            formatter.printHelp("find", options);
-        }        
-    }
-            
-}
diff --git a/sigil/ivy/resolver/example/multi-project/projects/list/build.properties b/sigil/ivy/resolver/example/multi-project/projects/list/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/list/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/example/multi-project/projects/list/build.xml b/sigil/ivy/resolver/example/multi-project/projects/list/build.xml
deleted file mode 100644
index 3926148..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/list/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="list" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/list/ivy.xml b/sigil/ivy/resolver/example/multi-project/projects/list/ivy.xml
deleted file mode 100644
index 6593fb7..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/list/ivy.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="list"
-        status="integration"/>
-    <configurations>
-      <conf name="core"/>
-      <conf name="standalone" extends="core"/>
-    </configurations>
-    <publications>
-      <artifact name="list" type="jar" conf="core" />
-    </publications>
-    <dependencies>
-      <dependency name="version" rev="latest.integration" conf="core->default" />
-      <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="standalone->default" />
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/list/sigil.properties b/sigil/ivy/resolver/example/multi-project/projects/list/sigil.properties
deleted file mode 100644
index 302cba7..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/list/sigil.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-
-# requirements
-
--imports:\
-  version, \
-  org.apache.commons.cli
-
-# exports
-
--bundles: list
-
-list;name: org.example.list
-list;-exports: list.*
-
diff --git a/sigil/ivy/resolver/example/multi-project/projects/list/src/list/ListFile.java b/sigil/ivy/resolver/example/multi-project/projects/list/src/list/ListFile.java
deleted file mode 100644
index 7467152..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/list/src/list/ListFile.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package list;
-
-import version.Version;
-import java.util.Collection;
-import java.util.ArrayList;
-import java.io.File;
-
-public class ListFile {
-  static {
-    Version.register("list");
-  }
-  
-  public static Collection list(File dir) {
-    Collection files = new ArrayList();
-    
-    return list(dir, files);
-  }
-  
-  private static Collection list(File file, Collection files) {
-    if (file.isDirectory()) {
-      File[] f = file.listFiles();
-      for (int i=0; i<f.length; i++) {
-        list(f[i], files);
-      }
-    } else {
-      files.add(file);
-    }
-    return files;
-  }
-}
diff --git a/sigil/ivy/resolver/example/multi-project/projects/list/src/list/Main.java b/sigil/ivy/resolver/example/multi-project/projects/list/src/list/Main.java
deleted file mode 100644
index 0f8cb14..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/list/src/list/Main.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package list;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.OptionBuilder;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-
-public class Main {
-    private static Options getOptions() {
-        Option dir = OptionBuilder.withArgName( "dir" )
-            .hasArg()
-            .withDescription(  "list files in given dir" )
-            .create( "dir" );
-        Options options = new Options();
-
-        options.addOption(dir);
-        
-        return options;
-    }
-    
-    public static void main(String[] args) throws Exception {
-      Options options = getOptions();
-      try {
-        
-        CommandLineParser parser = new GnuParser();
-
-        CommandLine line = parser.parse( options, args );
-        File dir = new File(line.getOptionValue("dir", "."));
-        Collection files = ListFile.list(dir);
-        System.out.println("listing files in "+dir);
-        for (Iterator it = files.iterator(); it.hasNext(); ) {
-          System.out.println("\t"+it.next()+"\n");
-        }
-      } catch( ParseException exp ) {
-          // oops, something went wrong
-          System.err.println( "Parsing failed.  Reason: " + exp.getMessage() );
-          
-        HelpFormatter formatter = new HelpFormatter();
-        formatter.printHelp( "list", options );
-      }        
-    }
-            
-}
diff --git a/sigil/ivy/resolver/example/multi-project/projects/sigil-defaults.properties b/sigil/ivy/resolver/example/multi-project/projects/sigil-defaults.properties
deleted file mode 100644
index d61df45..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/sigil-defaults.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-# sigil-defaults.properties
-
-package;org.apache.commons.cli: [1.1,1.2)
-package;org.apache.commons.collections: [3.0,4.0)
diff --git a/sigil/ivy/resolver/example/multi-project/projects/size/build.properties b/sigil/ivy/resolver/example/multi-project/projects/size/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/size/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/example/multi-project/projects/size/build.xml b/sigil/ivy/resolver/example/multi-project/projects/size/build.xml
deleted file mode 100644
index 2a75fe5..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/size/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="size" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/size/ivy.xml b/sigil/ivy/resolver/example/multi-project/projects/size/ivy.xml
deleted file mode 100644
index 7112b7f..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/size/ivy.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="size"
-        status="integration"/>
-    <dependencies>
-      <dependency name="version" rev="latest.integration" conf="default" />
-      <dependency name="list" rev="latest.integration" conf="default->core" />
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/size/sigil.properties b/sigil/ivy/resolver/example/multi-project/projects/size/sigil.properties
deleted file mode 100644
index cf239af..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/size/sigil.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-
--bundles: size
-
--exports: size
-
--imports:\
-  list, \
-  version
diff --git a/sigil/ivy/resolver/example/multi-project/projects/size/src/size/FileSize.java b/sigil/ivy/resolver/example/multi-project/projects/size/src/size/FileSize.java
deleted file mode 100644
index dcd4a1c..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/size/src/size/FileSize.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package size;
-
-import version.Version;
-import java.util.Collection;
-import java.util.Iterator;
-import java.io.File;
-
-public class FileSize {
-  static {
-    Version.register("size");
-  }
-
-  public static long totalSize(File dir) {
-    return totalSize(list.ListFile.list(dir));
-  }
-  
-  public static long totalSize(Collection files) {
-    long total = 0;
-    for (Iterator it = files.iterator(); it.hasNext(); ) {
-      File f = (File)it.next();
-      total += f.length();
-    }
-    return total;
-  }  
-}
diff --git a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/build.properties b/sigil/ivy/resolver/example/multi-project/projects/sizewhere/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/build.xml b/sigil/ivy/resolver/example/multi-project/projects/sizewhere/build.xml
deleted file mode 100644
index 0b8ab4c..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="sizewhere" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/ivy.xml b/sigil/ivy/resolver/example/multi-project/projects/sizewhere/ivy.xml
deleted file mode 100644
index d50bddb..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/ivy.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="sizewhere"
-        status="integration"/>
-    <configurations>
-      <conf name="core"/>
-      <conf name="standalone" extends="core"/>
-    </configurations>
-    <publications>
-      <artifact name="sizewhere" type="jar" conf="core" />
-    </publications>
-    <dependencies>
-      <dependency name="version" rev="latest.integration" conf="core->default" />
-      <dependency name="size" rev="latest.integration" conf="core->default" />
-      <dependency name="find" rev="latest.integration" conf="core" />
-      <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="standalone->default" />
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/sigil.properties b/sigil/ivy/resolver/example/multi-project/projects/sizewhere/sigil.properties
deleted file mode 100644
index c272f9b..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/sigil.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-
--bundles: sizewhere
-
--exports: sizewhere
-
--imports:\
-  find, \
-  size, \
-  version, \
-  org.apache.commons.cli
diff --git a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/src/sizewhere/Main.java b/sigil/ivy/resolver/example/multi-project/projects/sizewhere/src/sizewhere/Main.java
deleted file mode 100644
index 131af66..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/src/sizewhere/Main.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package sizewhere;
-
-import java.io.File;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.OptionBuilder;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-
-public class Main {
-    private static Options getOptions() {
-        Option dir = OptionBuilder.withArgName( "dir" )
-            .hasArg()
-            .withDescription(  "give total size of files in given dir" )
-            .create( "dir" );
-        Option name = OptionBuilder.withArgName( "name" )
-            .hasArg()
-            .withDescription(  "give total size of files with given name" )
-            .create( "name" );
-        Options options = new Options();
-
-        options.addOption(dir);
-        options.addOption(name);
-        
-        return options;
-    }
-    
-    public static void main(String[] args) throws Exception {
-      Options options = getOptions();
-      try {
-        
-        CommandLineParser parser = new GnuParser();
-
-        CommandLine line = parser.parse( options, args );
-        File dir = new File(line.getOptionValue("dir", "."));
-        String name = line.getOptionValue("name", "jar");
-        System.out.println("total size of files in "+dir+" containing "+name+": "+SizeWhere.totalSize(dir, name));
-      } catch( ParseException exp ) {
-          // oops, something went wrong
-          System.err.println( "Parsing failed.  Reason: " + exp.getMessage() );
-          
-        HelpFormatter formatter = new HelpFormatter();
-        formatter.printHelp( "sizewhere", options );
-      }        
-    }
-            
-}
diff --git a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/src/sizewhere/SizeWhere.java b/sigil/ivy/resolver/example/multi-project/projects/sizewhere/src/sizewhere/SizeWhere.java
deleted file mode 100644
index 3594bd9..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/sizewhere/src/sizewhere/SizeWhere.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package sizewhere;
-
-import version.Version;
-import size.FileSize;
-import find.FindFile;
-
-import java.util.Collection;
-import java.util.ArrayList;
-import java.io.File;
-
-public class SizeWhere {
-  static {
-    Version.register("sizewhere");
-  }
-  
-  public static long totalSize(File dir, String name) {
-    return FileSize.totalSize(FindFile.find(dir, name));
-  }
-}
diff --git a/sigil/ivy/resolver/example/multi-project/projects/version/build.properties b/sigil/ivy/resolver/example/multi-project/projects/version/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/version/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/example/multi-project/projects/version/build.xml b/sigil/ivy/resolver/example/multi-project/projects/version/build.xml
deleted file mode 100644
index 375db20..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/version/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="version" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/version/ivy.xml b/sigil/ivy/resolver/example/multi-project/projects/version/ivy.xml
deleted file mode 100644
index 16e08f3..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/version/ivy.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="version"
-        status="integration"/>
-</ivy-module>
diff --git a/sigil/ivy/resolver/example/multi-project/projects/version/sigil.properties b/sigil/ivy/resolver/example/multi-project/projects/version/sigil.properties
deleted file mode 100644
index a940ffd..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/version/sigil.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-
--bundles: version
-
--exports: version
diff --git a/sigil/ivy/resolver/example/multi-project/projects/version/src/version/Version.java b/sigil/ivy/resolver/example/multi-project/projects/version/src/version/Version.java
deleted file mode 100644
index 0c69bc5..0000000
--- a/sigil/ivy/resolver/example/multi-project/projects/version/src/version/Version.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package version;
-
-import java.io.InputStream;
-import java.util.Properties;
-import java.util.Map;
-import java.util.HashMap;
-
-public class Version {
-    static {
-        versions = new HashMap();
-        register("version");
-    }
-  
-    private static Map versions;
-  
-    public static void register(String module) {
-        try {
-            InputStream moduleVersion = Version.class.getResourceAsStream("/"+module+".properties");
-            Properties props = new Properties();
-            props.load(moduleVersion);
-            String version = (String)props.get("version");
-            versions.put(module, version);
-            System.out.println("--- using "+module+" v"+version);
-        } catch (Exception ex) {
-            System.err.println("an error occured while registering "+module+": "+ex.getMessage());
-            ex.printStackTrace();
-        }
-    }
-}
diff --git a/sigil/ivy/resolver/ivy.xml b/sigil/ivy/resolver/ivy.xml
deleted file mode 100644
index 2c7d0e6..0000000
--- a/sigil/ivy/resolver/ivy.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-  <info 
-        organisation="org.apache"
-        module="felix.sigil.ivy.resolver"
-        status="integration"/>
-   <publications>
-     <artifact name="org.apache.felix.sigil.ivy.resolver" />
-   </publications>
-</ivy-module>
diff --git a/sigil/ivy/resolver/sigil.properties b/sigil/ivy/resolver/sigil.properties
deleted file mode 100644
index db81f20..0000000
--- a/sigil/ivy/resolver/sigil.properties
+++ /dev/null
@@ -1,51 +0,0 @@
-
-# sigil project file, saved by plugin.
-
--bundles: \
-	org.apache.felix.sigil.ivy.resolver, \
-
--contents: \
-	profiles.*, \
-	aQute.bnd*, \
-	aQute.lib*, \
-	aQute.libg*, \
-	org.osgi.framework, \
-	org.apache.felix.sigil.*, \
-
--resources: \
-	DEPENDENCIES, \
-	NOTICE, \
-
--imports: \
-	org.apache.felix.sigil.common.bnd, \
-	org.apache.felix.sigil.common.config, \
-	org.apache.felix.sigil.common.core, \
-	org.apache.felix.sigil.common.core.licence, \
-	org.apache.felix.sigil.common.core.repository, \
-	org.apache.felix.sigil.common.model, \
-	org.apache.felix.sigil.common.model.eclipse, \
-	org.apache.felix.sigil.common.model.osgi, \
-	org.apache.felix.sigil.common.obr, \
-	org.apache.felix.sigil.common.osgi, \
-	org.apache.felix.sigil.common.repository, \
-	org.apache.ivy, \
-	org.apache.ivy.core, \
-	org.apache.ivy.core.module.descriptor, \
-	org.apache.ivy.core.module.id, \
-	org.apache.ivy.core.resolve, \
-	org.apache.ivy.core.settings, \
-	org.apache.ivy.plugins.parser, \
-	org.apache.ivy.plugins.parser.xml, \
-	org.apache.ivy.plugins.repository, \
-	org.apache.ivy.plugins.repository.file, \
-	org.apache.ivy.plugins.repository.url, \
-	org.apache.ivy.plugins.resolver, \
-	org.apache.ivy.plugins.resolver.util, \
-	org.apache.ivy.util, \
-	org.apache.tools.ant, \
-	org.apache.tools.ant.types, \
-	org.osgi.framework, \
-
-header;Class-Path: bndlib.jar org.eclipse.equinox.common.jar
-
-# end
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ant/BundleInfoTask.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ant/BundleInfoTask.java
deleted file mode 100644
index ad5bbb4..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ant/BundleInfoTask.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ant;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
-
-public class BundleInfoTask extends Task
-{
-    private File bundle;
-    private String header;
-    private String property;
-    private String defaultValue;
-
-    @Override
-    public void execute() throws BuildException
-    {
-        if (bundle == null)
-            throw new BuildException("missing attribute: bundle");
-        if (header == null)
-            throw new BuildException("missing attribute: header");
-
-        JarFile jar = null;
-
-        try
-        {
-            jar = new JarFile(bundle, false);
-            Manifest mf = jar.getManifest();
-            String value = mf.getMainAttributes().getValue(header);
-            if (property == null)
-            {
-                log(header + "=" + value);
-            }
-            else
-            {
-                if ("Bundle-SymbolicName".equals(header) && value != null)
-                {
-                    // remove singleton flag
-                    int semi = value.indexOf(';');
-                    if (semi > 0)
-                        value = value.substring(0, semi);
-                }
-                if (value == null)
-                {
-                    value = defaultValue;
-                }
-                if (value != null)
-                {
-                    getProject().setNewProperty(property, value);
-                }
-            }
-        }
-        catch (IOException e)
-        {
-            throw new BuildException("Failed to access bundle", e);
-        }
-        finally
-        {
-            if (jar != null)
-            {
-                try
-                {
-                    jar.close();
-                }
-                catch (IOException e)
-                {
-                    // TODO Auto-generated catch block
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-
-    public void setBundle(String bundle)
-    {
-        this.bundle = new File(bundle);
-    }
-
-    public void setHeader(String header)
-    {
-        this.header = header;
-    }
-
-    public void setProperty(String property)
-    {
-        this.property = property;
-    }
-
-    public void setDefaultValue(String defaultValue)
-    {
-        this.defaultValue = defaultValue;
-    }
-}
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ant/BundleTask.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ant/BundleTask.java
deleted file mode 100644
index ab2c4c2..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ant/BundleTask.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ant;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.bnd.BundleBuilder;
-import org.apache.felix.sigil.common.config.BldFactory;
-import org.apache.felix.sigil.common.config.IBldProject;
-import org.apache.felix.sigil.common.config.IBldProject.IBldBundle;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.types.Path;
-
-public class BundleTask extends Task
-{
-    private File[] classpath;
-    private String destPattern;
-    private boolean force;
-    private String property;
-    private String sigilFile;
-    private String revision;
-
-    @Override
-    public void execute() throws BuildException
-    {
-        if (classpath == null)
-            throw new BuildException("missing: attribute: classpathref");
-        if (destPattern == null)
-            throw new BuildException("missing attribute: destpattern");
-
-        @SuppressWarnings("unchecked")
-        Hashtable<String, String> projectProperties = getProject().getProperties();
-        Properties antProperties = new Properties();
-        antProperties.putAll(projectProperties);
-
-        IBldProject project;
-        try
-        {
-            project = BldFactory.getProject(getSigilFileURI(), antProperties);
-        }
-        catch (IOException e)
-        {
-            throw new BuildException("failed to get project file: " + e);
-        }
-
-        Properties env = new Properties();
-        for (String key : projectProperties.keySet())
-        {
-            if (key.matches("^[a-z].*"))
-            { // avoid props starting with Uppercase - bnd adds them to manifest
-                env.setProperty(key, projectProperties.get(key));
-            }
-        }
-
-        BundleBuilder bb = new BundleBuilder(project, classpath, destPattern, env);
-        boolean anyModified = false;
-
-        for (IBldBundle bundle : project.getBundles())
-        {
-            String id = bundle.getId();
-            log("creating bundle: " + id);
-            int nWarn = 0;
-            int nErr = 0;
-            String msg = "";
-
-            try
-            {
-                boolean modified = (bb.createBundle(bundle, force,
-                    new BundleBuilder.Log()
-                    {
-                        public void warn(String msg)
-                        {
-                            log(msg, Project.MSG_WARN);
-                        }
-
-                        public void verbose(String msg)
-                        {
-                            log(msg, Project.MSG_VERBOSE);
-                        }
-                    }));
-                nWarn = bb.warnings().size();
-                if (modified)
-                {
-                    anyModified = true;
-                }
-                else
-                {
-                    msg = " (not modified)";
-                }
-            }
-            catch (Exception e)
-            {
-                List<String> errors = bb.errors();
-                if (errors != null)
-                {
-                    nErr = errors.size();
-                    for (String err : errors)
-                    {
-                        log(err, Project.MSG_ERR);
-                    }
-                }
-                throw new BuildException("failed to create: " + id + ": " + e, e);
-            }
-            finally
-            {
-                log(id + ": " + count(nErr, "error") + ", " + count(nWarn, "warning")
-                    + msg);
-            }
-
-            if (revision != null)
-            {
-                // FIXME: hopefully if we have multiple bundles they all have the same version
-                getProject().setProperty(revision, bundle.getVersion());
-            }
-        }
-
-        if (anyModified && property != null)
-        {
-            getProject().setProperty(property, "true");
-        }
-    }
-
-    private URI getSigilFileURI()
-    {
-        File file = sigilFile == null ? new File(getProject().getBaseDir(),
-            IBldProject.PROJECT_FILE) : new File(sigilFile);
-        if (!file.isFile())
-        {
-            throw new BuildException("File not found " + file.getAbsolutePath());
-        }
-        return file.toURI();
-    }
-
-    private String count(int count, String msg)
-    {
-        return count + " " + msg + (count == 1 ? "" : "s");
-    }
-
-    public void setDestpattern(String pattern)
-    {
-        this.destPattern = pattern;
-    }
-
-    public void setForce(String force)
-    {
-        this.force = Boolean.parseBoolean(force);
-    }
-
-    public void setProperty(String property)
-    {
-        this.property = property;
-    }
-
-    public void setRevision(String revision)
-    {
-        this.revision = revision;
-    }
-
-    public void setClasspathref(String value)
-    {
-        Path p = (Path) getProject().getReference(value);
-        if (p == null)
-        {
-            throw new BuildException(value + "is not a path reference.");
-        }
-
-        String[] paths = p.list();
-        classpath = new File[paths.length];
-        for (int i = 0; i < paths.length; ++i)
-        {
-            classpath[i] = new File(paths[i]);
-        }
-    }
-
-    public void setSigilFile(String sigilFile)
-    {
-        this.sigilFile = sigilFile;
-    }
-}
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/BldRepositoryManager.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/BldRepositoryManager.java
deleted file mode 100644
index 4d925de..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/BldRepositoryManager.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ivy;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.common.repository.AbstractRepositoryManager;
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-
-public class BldRepositoryManager extends AbstractRepositoryManager
-{
-    private static Map<String, String> aliases = new HashMap<String, String>();
-
-    static
-    {
-        aliases.put("filesystem",
-            "org.apache.felix.sigil.common.core.repository.FileSystemRepositoryProvider");
-        aliases.put("obr", "org.apache.felix.sigil.common.obr.OBRRepositoryProvider");
-        aliases.put("project", "org.apache.felix.sigil.ivy.ProjectRepositoryProvider");
-        aliases.put("system",
-            "org.apache.felix.sigil.common.core.repository.SystemRepositoryProvider");
-    };
-
-    /**
-     * @param config
-     */
-    public BldRepositoryManager(IRepositoryConfig config)
-    {
-        super(config);
-    }
-
-    @Override
-    protected void loadRepositories()
-    {
-        List<IBundleRepository> list = new ArrayList<IBundleRepository>();
-        scanRepositories(getConfig().getRepositoryPath(), list);
-        setRepositories(list.toArray(new IBundleRepository[list.size()]));
-    }
-    
-    /**
-     * @param list 
-     * @param config2
-     * @param i
-     */
-    private void scanRepositories(List<String> path, List<IBundleRepository> list)
-    {
-        for (String name : path)
-        {
-            if ( IRepositoryConfig.WILD_CARD.equals(name) ) {
-                HashSet<String> defined = new HashSet<String>();
-                for (String n : path) {
-                    if (!IRepositoryConfig.WILD_CARD.equals(n)) {
-                        defined.add(n);
-                    }
-                }
-                List<String> subpath = new LinkedList<String>();
-                for (String key : getConfig().getAllRepositories()) {
-                    if (!defined.contains(key))
-                    {
-                        subpath.add(key);
-                    }
-                }
-                scanRepositories(subpath, list);
-            }
-            else {
-                Properties props = getConfig().getRepositoryConfig(name);
-                if (props != null) {
-                    IBundleRepository repo = buildRepository(name, props);
-                    
-                    if ( repo != null ) {
-                        list.add(repo);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @param repo
-     * @return 
-     */
-    private static IBundleRepository buildRepository(String name, Properties repo)
-    {
-        String disabled = repo.getProperty("disabled");
-        if ("true".equalsIgnoreCase(disabled == null ? null : disabled.trim())) return null;
-        
-        String optStr = repo.getProperty("optional", "false");
-        boolean optional = Boolean.parseBoolean(optStr.trim());
-
-        String alias = repo.getProperty(IRepositoryConfig.REPOSITORY_PROVIDER);
-        if (alias == null)
-        {
-            String msg = "provider not specified for repository: " + name;
-            
-            if (!optional)
-                throw new IllegalStateException(msg);
-            
-            Log.warn(msg);
-        }
-
-        String provider = (aliases.containsKey(alias) ? aliases.get(alias) : alias);
-
-        if (alias.equals("obr"))
-        {
-            // cache is directory where synchronized bundles are stored;
-            // not needed in ivy.
-            repo.setProperty("cache", "/no-cache");
-            String index = repo.getProperty("index");
-
-            if (index == null)
-            {
-                // index is created to cache OBR url
-                File indexFile = new File(System.getProperty("java.io.tmpdir"),
-                    "obr-index-" + name);
-                indexFile.deleteOnExit();
-                repo.setProperty("index", indexFile.getAbsolutePath());
-            }
-            else
-            {
-                if (!new File(index).getParentFile().mkdirs())
-                {
-                    // ignore - but keeps findbugs happy
-                }
-            }
-        }
-
-        try
-        {
-            IRepositoryProvider instance = (IRepositoryProvider) (Class.forName(provider).newInstance());
-            IBundleRepository repository = instance.createRepository(name, repo);
-            return repository;
-        }
-        catch (Exception e)
-        {
-            String msg = "failed to create repository: ";
-            if (!optional)
-                throw new IllegalStateException(msg + repo + " " + e, e);
-            Log.warn(msg + e);
-        }
-        
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/BldResolver.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/BldResolver.java
deleted file mode 100644
index f8a96fd..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/BldResolver.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ivy;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.common.core.BldCore;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.repository.IResolution;
-import org.apache.felix.sigil.common.repository.IResolutionMonitor;
-import org.apache.felix.sigil.common.repository.ResolutionConfig;
-import org.apache.felix.sigil.common.repository.ResolutionException;
-
-public class BldResolver implements IBldResolver
-{
-    private BldRepositoryManager manager;
-    private final IRepositoryConfig config;
-    
-    static
-    {
-        try
-        {
-            BldCore.init();
-        }
-        catch (Exception e)
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    };
-
-    /**
-     * @param project
-     */
-    public BldResolver(IRepositoryConfig config)
-    {
-        this.config = config;
-    }
-
-    public IResolution resolve(IModelElement element, boolean transitive)
-    {
-        int options = ResolutionConfig.IGNORE_ERRORS | ResolutionConfig.INCLUDE_OPTIONAL;
-        if (transitive)
-            options |= ResolutionConfig.INCLUDE_DEPENDENTS;
-
-        ResolutionConfig config = new ResolutionConfig(options);
-        try
-        {
-            return resolve(element, config);
-        }
-        catch (ResolutionException e)
-        {
-            throw new IllegalStateException(
-                "eek! this shouldn't happen when ignoreErrors=true", e);
-        }
-    }
-
-    public IResolution resolveOrFail(IModelElement element, boolean transitive)
-        throws ResolutionException
-    {
-        int options = 0;
-        if (transitive)
-            options |= ResolutionConfig.INCLUDE_DEPENDENTS;
-        ResolutionConfig config = new ResolutionConfig(options);
-        return resolve(element, config);
-    }
-
-    private IResolution resolve(IModelElement element, ResolutionConfig config)
-        throws ResolutionException
-    {
-        if (manager == null)
-        {
-            manager = new BldRepositoryManager(this.config);
-        }
-
-        IResolutionMonitor ivyMonitor = new IResolutionMonitor()
-        {
-            public void endResolution(IModelElement requirement, ISigilBundle sigilBundle)
-            {
-                Log.debug("Resolved " + requirement + " -> " + sigilBundle);
-            }
-
-            public boolean isCanceled()
-            {
-                return false;
-            }
-
-            public void startResolution(IModelElement requirement)
-            {
-                Log.verbose("Resolving " + requirement);
-            }
-        };
-
-        return manager.getBundleResolver().resolve(element, config, ivyMonitor);
-    }
-}
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/FindUtil.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/FindUtil.java
deleted file mode 100644
index 2a6c7cd..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/FindUtil.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ivy;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.TreeSet;
-
-public class FindUtil
-{
-    static final String WILD_ANY = "[^.]?.*";
-    static final String WILD_ONE = "[^.]?[^;]*"; // WILD_ONE.endsWith(WILD_ANY) == false
-
-    // example pattern: ${repository}/projects/abc*/*/project.sigil
-    public static Collection<File> findFiles(File workingDir, String pattern)
-        throws IOException
-    {
-        int star = pattern.indexOf("*");
-        if (star == -1)
-        {
-            throw new IOException("pattern doesn't contain '*': " + pattern);
-        }
-        int slash = pattern.lastIndexOf('/', star);
-
-        String regex = pattern.substring((slash == -1) ? 0 : slash + 1);
-        regex = regex.replaceAll("\\*\\*", "-wildany-");
-        regex = regex.replaceAll("\\*", "-wildone-");
-        regex = regex.replaceAll("-wildany-", WILD_ANY);
-        regex = regex.replaceAll("-wildone-", WILD_ONE);
-
-        String[] patterns = regex.split("/");
-
-        TreeSet<File> list = new TreeSet<File>();
-        File root = slash == -1 ? workingDir
-            : new File(pattern.substring(0, slash)).getAbsoluteFile();
-
-        if (root.isDirectory())
-        {
-            findFiles(root, 0, patterns, list);
-        }
-        else
-        {
-            throw new IOException("pattern root directory does not exist: " + root);
-        }
-
-        return list;
-    }
-
-    private static void findFiles(File dir, int level, String[] patterns,
-        Collection<File> list)
-    {
-        final String filePattern = patterns[patterns.length - 1] + "$";
-        final String dirPattern;
-
-        if (level < patterns.length - 1)
-        {
-            dirPattern = patterns[level];
-        }
-        else
-        {
-            dirPattern = "/"; // impossible to match marker
-        }
-
-        final boolean stillWild;
-        if ((level > 0) && (level < patterns.length)
-            && patterns[level - 1].endsWith(WILD_ANY))
-        {
-            stillWild = true;
-        }
-        else
-        {
-            stillWild = false;
-        }
-
-        for (File path : dir.listFiles(new FileFilter()
-        {
-            public boolean accept(File pathname)
-            {
-                String name = pathname.getName();
-                if (pathname.isDirectory())
-                {
-                    return name.matches(dirPattern)
-                        || (stillWild && name.matches(WILD_ANY));
-                }
-                else if (dirPattern.equals("/") || dirPattern.equals(WILD_ANY))
-                {
-                    return name.matches(filePattern);
-                }
-                else
-                {
-                    return false;
-                }
-            }
-        }))
-        {
-            if (path.isDirectory())
-            {
-                int inc = path.getName().matches(dirPattern) ? 1 : 0;
-                findFiles(path, level + inc, patterns, list);
-            }
-            else
-            {
-                list.add(path);
-            }
-        }
-    }
-}
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/IBldResolver.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/IBldResolver.java
deleted file mode 100644
index f39693d..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/IBldResolver.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ivy;
-
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.repository.IResolution;
-import org.apache.felix.sigil.common.repository.ResolutionException;
-
-public interface IBldResolver
-{
-    IResolution resolveOrFail(IModelElement element, boolean transitive)
-        throws ResolutionException;
-
-    IResolution resolve(IModelElement element, boolean transitive);
-}
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/Log.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/Log.java
deleted file mode 100644
index 7237ac2..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/Log.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ivy;
-
-import org.apache.ivy.util.Message;
-
-// ensure common prefix to all sigil messages
-public class Log
-{
-    public static final String PREFIX = "Sigil: ";
-
-    private static final boolean highlight = false;
-
-    public static void error(String msg)
-    {
-        if (highlight)
-            Message.deprecated(PREFIX + "[error] " + msg);
-        Message.error(PREFIX + msg);
-    }
-
-    public static void warn(String msg)
-    {
-        if (highlight)
-            Message.deprecated(PREFIX + "[warn] " + msg);
-        else
-            Message.warn(PREFIX + msg);
-    }
-
-    public static void info(String msg)
-    {
-        if (highlight)
-            Message.deprecated(PREFIX + "[info] " + msg);
-        else
-            Message.info(PREFIX + msg);
-    }
-
-    public static void verbose(String msg)
-    {
-        Message.verbose(PREFIX + "[verbose] " + msg);
-    }
-
-    public static void debug(String msg)
-    {
-        if (highlight)
-            Message.deprecated(PREFIX + "[debug] " + msg);
-        else
-            Message.debug(PREFIX + msg);
-    }
-
-}
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/ProjectRepository.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/ProjectRepository.java
deleted file mode 100644
index 75a21fa..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/ProjectRepository.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ivy;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.felix.sigil.common.config.BldFactory;
-import org.apache.felix.sigil.common.config.IBldProject;
-import org.apache.felix.sigil.common.config.IBldProject.IBldBundle;
-import org.apache.felix.sigil.common.core.licence.ILicensePolicy;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.osgi.VersionTable;
-import org.apache.felix.sigil.common.repository.AbstractBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryVisitor;
-import org.apache.ivy.core.module.descriptor.Artifact;
-import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-
-import org.osgi.framework.Version;
-
-public class ProjectRepository extends AbstractBundleRepository
-{
-    private ArrayList<ISigilBundle> bundles;
-    private ArrayList<ISigilBundle> wildBundles;
-    private String projectFilePattern;
-
-    /* package */ProjectRepository(String id, String projectFilePattern)
-    {
-        super(id);
-        this.projectFilePattern = projectFilePattern.replaceAll("\\[sigilproject\\]",
-            IBldProject.PROJECT_FILE);
-    }
-
-    @Override
-    public void accept(IRepositoryVisitor visitor, int options)
-    {
-        for (ISigilBundle b : getBundles())
-        {
-            if (!visitor.visit(b))
-            {
-                break;
-            }
-        }
-    }
-
-    // override to provide fuzzy matching for wild-card exports.
-    @Override
-    public Collection<ISigilBundle> findAllProviders(final IPackageImport pi, int options)
-    {
-        return findProviders(pi, options, false);
-    }
-
-    @Override
-    public ISigilBundle findProvider(IPackageImport pi, int options)
-    {
-        Collection<ISigilBundle> found = findProviders(pi, options, true);
-        return found.isEmpty() ? null : found.iterator().next();
-    }
-
-    private Collection<ISigilBundle> findProviders(final IPackageImport pi, int options,
-        boolean findFirst)
-    {
-        ArrayList<ISigilBundle> found = new ArrayList<ISigilBundle>();
-        ILicensePolicy policy = findPolicy(pi);
-        String name = pi.getPackageName();
-        VersionRange versions = pi.getVersions();
-
-        // find exact match(es)
-        for (ISigilBundle bundle : getBundles())
-        {
-            if (policy.accept(bundle))
-            {
-                for (IPackageExport exp : bundle.getBundleInfo().getExports())
-                {
-                    if (name.equals(exp.getPackageName())
-                        && versions.contains(exp.getVersion()))
-                    {
-                        found.add(bundle);
-                        if (findFirst)
-                            return found;
-                    }
-                }
-            }
-        }
-
-        if (!found.isEmpty())
-            return found;
-
-        // find best fuzzy match
-        ISigilBundle fuzzyMatch = null;
-        int fuzzyLen = 0;
-
-        for (ISigilBundle bundle : getWildBundles())
-        {
-            if (policy.accept(bundle))
-            {
-                for (IPackageExport exp : bundle.getBundleInfo().getExports())
-                {
-                    String export = exp.getPackageName();
-                    if (export.endsWith("*"))
-                    {
-                        String export1 = export.substring(0, export.length() - 1);
-                        if ((name.startsWith(export1) || export1.equals(name + "."))
-                            && versions.contains(exp.getVersion()))
-                        {
-                            if (export1.length() > fuzzyLen)
-                            {
-                                fuzzyLen = export1.length();
-                                fuzzyMatch = bundle;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        if (fuzzyMatch != null)
-            found.add(fuzzyMatch);
-
-        return found;
-    }
-
-    private synchronized void init()
-    {
-        System.out.println("Sigil: loading Project Repository: " + projectFilePattern);
-
-        ArrayList<File> projects = new ArrayList<File>();
-
-        for (String pattern : projectFilePattern.split("\\s+"))
-        {
-            try
-            {
-                Collection<File> files = FindUtil.findFiles(new File(""), pattern);
-                if (files.isEmpty())
-                {
-                    Log.warn("ProjectRepository: no projects match: " + pattern);
-                }
-                else
-                {
-                    projects.addAll(files);
-                }
-            }
-            catch (IOException e)
-            {
-                // pattern root dir does not exist
-                Log.error("ProjectRepository: " + pattern + ": " + e.getMessage());
-            }
-        }
-
-        if (projects.isEmpty())
-        {
-            throw new IllegalArgumentException(
-                "ProjectRepository: no projects found using pattern: "
-                    + projectFilePattern + " pwd=" + new File("").getAbsolutePath());
-        }
-
-        bundles = new ArrayList<ISigilBundle>();
-
-        for (File proj : projects)
-        {
-            try
-            {
-                addBundles(proj, bundles);
-            }
-            catch (IOException e)
-            {
-                Log.warn("Skipping project: " + proj + ": " + e.getMessage());
-            }
-            catch (ParseException e)
-            {
-                Log.warn("Skipping project: " + proj + ": " + e.getMessage());
-            }
-        }
-    }
-
-    private List<ISigilBundle> getBundles()
-    {
-        if (bundles == null)
-        {
-            init();
-        }
-        return bundles;
-    }
-
-    private List<ISigilBundle> getWildBundles()
-    {
-        if (wildBundles == null)
-        {
-            wildBundles = new ArrayList<ISigilBundle>();
-            for (ISigilBundle bundle : getBundles())
-            {
-                for (IPackageExport exp : bundle.getBundleInfo().getExports())
-                {
-                    String export = exp.getPackageName();
-                    if (export.endsWith("*"))
-                    {
-                        wildBundles.add(bundle);
-                        break;
-                    }
-                }
-            }
-        }
-        return wildBundles;
-    }
-
-    public void refresh()
-    {
-        bundles = null;
-        wildBundles = null;
-        notifyChange();
-    }
-
-    private void addBundles(File file, List<ISigilBundle> list) throws IOException,
-        ParseException
-    {
-        URI uri = file.getCanonicalFile().toURI();
-        IBldProject project = BldFactory.getProject(uri);
-
-        for (IBldBundle bb : project.getBundles())
-        {
-            IBundleModelElement info = ModelElementFactory.getInstance().newModelElement(
-                IBundleModelElement.class);
-
-            for (IPackageExport pexport : bb.getExports())
-            {
-                info.addExport(pexport);
-            }
-
-            for (IPackageImport import1 : bb.getImports())
-            {
-                IPackageImport clone = (IPackageImport) import1.clone();
-                clone.setParent(null);
-                info.addImport(clone);
-            }
-
-            for (IRequiredBundle require : bb.getRequires())
-            {
-                IRequiredBundle clone = (IRequiredBundle) require.clone();
-                clone.setParent(null);
-                info.addRequiredBundle(clone);
-            }
-
-            info.setSymbolicName(bb.getSymbolicName());
-
-            Version version = VersionTable.getVersion(bb.getVersion());
-            info.setVersion(version);
-
-            ISigilBundle pb = ModelElementFactory.getInstance().newModelElement(
-                ISigilBundle.class);
-            pb.setBundleInfo(info);
-
-            Map<Object, Object> meta = new HashMap<Object, Object>();
-            ModuleDescriptor md = SigilParser.instance().parseDescriptor(uri.toURL());
-            if (!bb.getId().equals(md.getModuleRevisionId().getName()))
-            { // non-default artifact
-                for (Artifact a : md.getAllArtifacts())
-                {
-                    if (a.getName().equals(bb.getId()))
-                    {
-                        meta.put(Artifact.class, a);
-                        break;
-                    }
-                }
-            }
-
-            meta.put(ModuleDescriptor.class, md);
-            pb.setMeta(meta);
-
-            list.add(pb);
-            Log.debug("ProjectRepository: added " + pb);
-            Log.debug("ProjectRepository: exports " + bb.getExports());
-        }
-    }
-}
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/ProjectRepositoryProvider.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/ProjectRepositoryProvider.java
deleted file mode 100644
index 026d981..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/ProjectRepositoryProvider.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ivy;
-
-import java.util.HashMap;
-import java.util.Properties;
-
-import org.apache.felix.sigil.common.repository.IBundleRepository;
-import org.apache.felix.sigil.common.repository.IRepositoryProvider;
-import org.apache.felix.sigil.common.repository.RepositoryException;
-
-public class ProjectRepositoryProvider implements IRepositoryProvider
-{
-    private static HashMap<String, ProjectRepository> cache = new HashMap<String, ProjectRepository>();
-
-    public IBundleRepository createRepository(String id, Properties properties)
-        throws RepositoryException
-    {
-        ProjectRepository repository = cache.get(id);
-
-        if (repository == null)
-        {
-            String pattern = properties.getProperty("pattern");
-            if (pattern == null)
-            {
-                throw new RepositoryException("property 'pattern' not specified.");
-            }
-            repository = new ProjectRepository(id, pattern);
-            cache.put(id, repository);
-        }
-
-        return repository;
-    }
-}
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/SigilParser.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/SigilParser.java
deleted file mode 100644
index faf7b23..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/SigilParser.java
+++ /dev/null
@@ -1,711 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ivy;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URL;
-import java.text.ParseException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-import org.apache.felix.sigil.common.config.BldFactory;
-import org.apache.felix.sigil.common.config.IBldProject;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IPackageImport;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.repository.IResolution;
-import org.apache.ivy.Ivy;
-import org.apache.ivy.core.IvyContext;
-import org.apache.ivy.core.module.descriptor.Artifact;
-import org.apache.ivy.core.module.descriptor.Configuration;
-import org.apache.ivy.core.module.descriptor.DefaultDependencyArtifactDescriptor;
-import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor;
-import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
-import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
-import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-import org.apache.ivy.core.module.id.ModuleRevisionId;
-import org.apache.ivy.core.settings.IvySettings;
-import org.apache.ivy.plugins.parser.ModuleDescriptorParser;
-import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
-import org.apache.ivy.plugins.parser.ParserSettings;
-import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParser;
-import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorWriter;
-import org.apache.ivy.plugins.repository.Resource;
-import org.apache.ivy.plugins.repository.file.FileResource;
-import org.apache.ivy.plugins.repository.url.URLResource;
-import org.apache.ivy.plugins.resolver.DependencyResolver;
-
-public class SigilParser implements ModuleDescriptorParser
-{
-
-    private static DelegateParser instance;
-
-    // used by ProjectRepository
-    static synchronized DelegateParser instance()
-    {
-        if (instance == null)
-            throw new IllegalStateException("SigilParser is not instantiated.");
-
-        return instance;
-    }
-
-    public SigilParser()
-    {
-        synchronized (SigilParser.class)
-        {
-            if (instance == null)
-            {
-                instance = new DelegateParser();
-            }
-        }
-    }
-
-    /**
-     * In IvyDE, IvyContext is not available, so we can't find the SigilResolver.
-     * This allows us to construct one.
-     * @deprecated temporary to support IvyDE
-     */
-    public void setConfig(String config)
-    {
-        instance.config = config;
-    }
-
-    /**
-     * sets delegate parser.
-     * If not set, we delegate to the default Ivy parser.
-     * @param type name returned by desired parser's getType() method.
-     */
-    public void setDelegateType(String type)
-    {
-        for (ModuleDescriptorParser parser : ModuleDescriptorParserRegistry.getInstance().getParsers())
-        {
-            if (parser.getType().equals(type))
-            {
-                instance.delegate = parser;
-                break;
-            }
-        }
-
-        if (instance.delegate == null)
-        {
-            throw new IllegalArgumentException("Can't find parser delegateType=" + type);
-        }
-    }
-
-    /**
-     * sets default file name the delegate parser accepts.
-     * If not set, defaults to "ivy.xml".
-     * @param name
-     */
-    public void setDelegateFile(String name)
-    {
-        instance.ivyFile = name;
-    }
-
-    /**
-     * sets the dependencies to keep from the delegate parser.
-     * If not set, all existing dependencies are dropped.
-     * @param regex pattern matching dependency names to keep.
-     */
-    public void setKeepDependencies(String regex)
-    {
-        instance.keepDependencyPattern = Pattern.compile(regex);
-    }
-
-    /**
-     * reduce level of info logging.
-     * @param quiet
-     */
-    public void setQuiet(String quiet)
-    {
-        instance.quiet = Boolean.parseBoolean(quiet);
-    }
-
-    /**
-     * sets the SigilResolver we use.
-     * If not set, we use the first SigilResolver we find.
-     * @param name
-     */
-    public void setResolver(String name)
-    {
-        instance.resolverName = name;
-    }
-
-    /**
-     * adds override element: <override name="X" pattern="Y" replace="Z"/>. Overrides
-     * Ivy variables using a pattern substitution on the resource directory path.
-     * 
-     * @deprecated
-     * This is only needed when a delegate parser expects Ant variables to be set
-     * during the ivy:buildlist task (or the ProjectRepository initialisation),
-     * which they are not. The delegate parser should really be fixed, as otherwise
-     * the ivy:buildlist task won't work without this workaround.
-     */
-    // e.g. <override name="ant.project.name" pattern=".*/([^/]+)/([^/]+)$" replace="$1-$2"/>
-    public void addConfiguredOverride(Map<String, String> var)
-    {
-        final String name = var.get("name");
-        final String regex = var.get("pattern");
-        final String replace = var.get("replace");
-
-        if (name == null || regex == null || replace == null)
-            throw new IllegalArgumentException(
-                "override must contain name, pattern and replace attributes.");
-
-        instance.varRegex.put(name, Pattern.compile(regex));
-        instance.varReplace.put(name, replace);
-    }
-
-    // implement ModuleDescriptorParser interface by delegation to singleton instance.
-
-    public boolean accept(Resource res)
-    {
-        return instance.accept(res);
-    }
-
-    public Artifact getMetadataArtifact(ModuleRevisionId mrid, Resource res)
-    {
-        return instance.getMetadataArtifact(mrid, res);
-    }
-
-    public String getType()
-    {
-        return instance.getType();
-    }
-
-    public ModuleDescriptor parseDescriptor(ParserSettings settings, URL xmlURL,
-        boolean validate) throws ParseException, IOException
-    {
-        return instance.parseDescriptor(settings, xmlURL, validate);
-    }
-
-    public ModuleDescriptor parseDescriptor(ParserSettings settings, URL xmlURL,
-        Resource res, boolean validate) throws ParseException, IOException
-    {
-        return instance.parseDescriptor(settings, xmlURL, res, validate);
-    }
-
-    public void toIvyFile(InputStream source, Resource res, File destFile,
-        ModuleDescriptor md) throws ParseException, IOException
-    {
-        instance.toIvyFile(source, res, destFile, md);
-    }
-
-    /**
-     * delegating parser.
-     * (optionally) removes original dependencies and augments with sigil-determined dependencies.
-     */
-    static class DelegateParser extends XmlModuleDescriptorParser
-    {
-
-        private static final String SIGIL_BUILDLIST = IBldProject.PROJECT_FILE;
-        private static final String KEEP_ALL = ".*";
-
-        private IBldResolver resolver;
-        private ParserSettings defaultSettings;
-        private Map<String, DefaultModuleDescriptor> rawCache = new HashMap<String, DefaultModuleDescriptor>();
-        private Map<String, DefaultModuleDescriptor> augmentedCache = new HashMap<String, DefaultModuleDescriptor>();
-
-        private HashMap<String, String> varReplace = new HashMap<String, String>();
-        private HashMap<String, Pattern> varRegex = new HashMap<String, Pattern>();
-
-        private ModuleDescriptorParser delegate;
-        private String ivyFile = "ivy.xml";
-        private String resolverName;
-        private Pattern keepDependencyPattern;
-        private boolean quiet;
-        private String config;
-
-        @Override
-        public boolean accept(Resource res)
-        {
-            boolean accept = (res instanceof SigilResolver.SigilIvy)
-                || res.getName().endsWith("/" + SIGIL_BUILDLIST)
-                || ((instance.getSigilURI(res) != null) && ((instance.delegate != null ? instance.delegate.accept(res)
-                    : false) || super.accept(res)));
-            if (accept)
-                Log.verbose("accepted: " + res);
-            return accept;
-        }
-
-        @Override
-        public void toIvyFile(InputStream source, Resource res, File destFile,
-            ModuleDescriptor md) throws ParseException, IOException
-        {
-            Log.verbose("writing resource: " + res + " toIvyFile: " + destFile);
-            // source allows us to keep layout and comments,
-            // but this doesn't work if source is not ivy.xml.
-            // So just write file directly from descriptor.
-            try
-            {
-                XmlModuleDescriptorWriter.write(md, destFile);
-            }
-            finally
-            {
-                if (source != null)
-                    source.close();
-            }
-        }
-
-        @Override
-        public ModuleDescriptor parseDescriptor(ParserSettings settings, URL xmlURL,
-            boolean validate) throws ParseException, IOException
-        {
-            return parseDescriptor(settings, xmlURL, new URLResource(xmlURL), validate);
-        }
-
-        @Override
-        public ModuleDescriptor parseDescriptor(ParserSettings settings, URL xmlURL,
-            Resource res, boolean validate) throws ParseException, IOException
-        {
-            String cacheKey = xmlURL.toString() + settings.hashCode();
-            DefaultModuleDescriptor dmd = augmentedCache.get(cacheKey);
-
-            if (dmd == null)
-            {
-                dmd = rawCache.get(cacheKey);
-                if (dmd == null)
-                {
-                    dmd = delegateParse(settings, xmlURL, res, validate);
-                }
-
-                if (!quiet)
-                    Log.info("augmenting module=" + dmd.getModuleRevisionId().getName()
-                        + " ant.project.name="
-                        + settings.substitute("${ant.project.name}"));
-
-                addDependenciesToDescriptor(res, dmd);
-                augmentedCache.put(cacheKey, dmd);
-
-                Log.verbose("augmented dependencies: "
-                    + Arrays.asList(dmd.getDependencies()));
-            }
-
-            return dmd;
-        }
-
-        // used by ProjectRepository
-        ModuleDescriptor parseDescriptor(URL projectURL) throws ParseException,
-            IOException
-        {
-            if (defaultSettings == null)
-            {
-                Ivy ivy = IvyContext.getContext().peekIvy();
-                if (ivy == null)
-                    throw new IllegalStateException(
-                        "can't get default settings - no ivy context.");
-                defaultSettings = ivy.getSettings();
-            }
-
-            URL ivyURL = new URL(projectURL, ivyFile);
-            String cacheKey = ivyURL.toString() + defaultSettings.hashCode();
-            DefaultModuleDescriptor dmd = rawCache.get(cacheKey);
-
-            if (dmd == null)
-            {
-                URLResource res = new URLResource(ivyURL);
-                // Note: this doesn't contain the augmented dependencies, which is OK,
-                // since the ProjectRepository only needs the id and status.
-                dmd = delegateParse(defaultSettings, ivyURL, res, false);
-                rawCache.put(cacheKey, dmd);
-            }
-
-            return dmd;
-        }
-
-        private DefaultModuleDescriptor delegateParse(ParserSettings settings,
-            URL xmlURL, Resource res, boolean validate) throws ParseException,
-            IOException
-        {
-            String resName = res.getName();
-
-            if (resName.endsWith("/" + SIGIL_BUILDLIST))
-            {
-                String name = resName.substring(0, resName.length()
-                    - SIGIL_BUILDLIST.length());
-                res = res.clone(name + ivyFile);
-                xmlURL = new URL(xmlURL, ivyFile);
-            }
-
-            if (settings instanceof IvySettings)
-            {
-                IvySettings ivySettings = (IvySettings) settings;
-                String dir = new File(res.getName()).getParent();
-
-                for (String name : varRegex.keySet())
-                {
-                    Pattern regex = varRegex.get(name);
-                    String replace = varReplace.get(name);
-
-                    String value = regex.matcher(dir).replaceAll(replace);
-
-                    Log.debug("overriding variable " + name + "=" + value);
-                    ivySettings.setVariable(name, value);
-                }
-            }
-
-            ModuleDescriptor md = null;
-            if (delegate == null || !delegate.accept(res))
-            {
-                md = super.parseDescriptor(settings, xmlURL, res, validate);
-            }
-            else
-            {
-                md = delegate.parseDescriptor(settings, xmlURL, res, validate);
-            }
-
-            return mungeDescriptor(md, res);
-        }
-
-        /**
-         * clones descriptor and removes dependencies, as descriptor MUST have
-         * 'this' as the parser given to its constructor.
-         * Only dependency names matched by keepDependencyPattern are kept,
-         * as we're going to add our own dependencies later.
-         */
-        private DefaultModuleDescriptor mungeDescriptor(ModuleDescriptor md, Resource res)
-        {
-
-            if ((md instanceof DefaultModuleDescriptor) && (md.getParser() == this)
-                && (KEEP_ALL.equals(keepDependencyPattern)))
-            {
-                return (DefaultModuleDescriptor) md;
-            }
-
-            DefaultModuleDescriptor dmd = new DefaultModuleDescriptor(this, res);
-
-            dmd.setModuleRevisionId(md.getModuleRevisionId());
-            dmd.setPublicationDate(md.getPublicationDate());
-
-            for (Configuration c : md.getConfigurations())
-            {
-                String conf = c.getName();
-
-                dmd.addConfiguration(c);
-
-                for (Artifact a : md.getArtifacts(conf))
-                {
-                    dmd.addArtifact(conf, a);
-                }
-            }
-
-            if (keepDependencyPattern != null)
-            {
-                for (DependencyDescriptor dependency : md.getDependencies())
-                {
-                    String name = dependency.getDependencyId().getName();
-                    if (keepDependencyPattern.matcher(name).matches())
-                    {
-                        dmd.addDependency(dependency);
-                    }
-                }
-            }
-
-            return dmd;
-        }
-
-        /*
-         * find URI to Sigil project file. This assumes that it is in the same
-         * directory as the ivy file.
-         */
-        private URI getSigilURI(Resource res)
-        {
-            URI uri = null;
-
-            if (res instanceof URLResource)
-            {
-                URL url = ((URLResource) res).getURL();
-                uri = URI.create(url.toString()).resolve(IBldProject.PROJECT_FILE);
-                try
-                {
-                    InputStream stream = uri.toURL().openStream(); // check file
-                    // exists
-                    stream.close();
-                }
-                catch (IOException e)
-                {
-                    uri = null;
-                }
-            }
-            else if (res instanceof FileResource)
-            {
-                uri = ((FileResource) res).getFile().toURI().resolve(
-                    IBldProject.PROJECT_FILE);
-                if (!(new File(uri).exists()))
-                    uri = null;
-            }
-
-            return uri;
-        }
-
-        /*
-         * add sigil dependencies to ModuleDescriptor.
-         */
-        private void addDependenciesToDescriptor(Resource res, DefaultModuleDescriptor md)
-            throws IOException
-        {
-            // FIXME: transitive should be configurable
-            final boolean transitive = true; // ivy default is true
-            final boolean changing = false;
-            final boolean force = false;
-
-            URI uri = getSigilURI(res);
-            if (uri == null)
-                return;
-
-            IBldProject project;
-
-            project = BldFactory.getProject(uri);
-
-            IBundleModelElement requirements = project.getDependencies();
-            Log.verbose("requirements: " + Arrays.asList(requirements.children()));
-
-            // preserve version range for Require-Bundle
-            // XXX: synthesise bundle version range corresponding to package version ranges?
-            HashMap<String, VersionRange> versions = new HashMap<String, VersionRange>();
-            for (IModelElement child : requirements.children())
-            {
-                if (child instanceof IRequiredBundle)
-                {
-                    IRequiredBundle bundle = (IRequiredBundle) child;
-                    versions.put(bundle.getSymbolicName(), bundle.getVersions());
-                }
-            }
-
-            IBldResolver resolver = findResolver();
-            if (resolver == null)
-            {
-                // this can happen in IvyDE, but it retries and is OK next time.
-                Log.warn("failed to find resolver - IvyContext not yet available.");
-                return;
-            }
-
-            IResolution resolution = resolver.resolve(requirements, false);
-            Log.verbose("resolution: " + resolution.getBundles());
-
-            ModuleRevisionId masterMrid = md.getModuleRevisionId();
-            DefaultDependencyDescriptor dd;
-            ModuleRevisionId mrid;
-
-            for (ISigilBundle bundle : resolution.getBundles())
-            {
-                IBundleModelElement info = bundle.getBundleInfo();
-                String name = info.getSymbolicName();
-
-                if ("system bundle".equals(name))
-                {
-                    // e.g. SystemProvider with framework=null
-                    Log.verbose("Discarding system bundle");
-                    continue;
-                }
-
-                ModuleDescriptor bmd = (ModuleDescriptor) bundle.getMeta().get(
-                    ModuleDescriptor.class);
-                if (bmd != null)
-                {
-                    ModuleRevisionId bmrid = bmd.getModuleRevisionId();
-                    String org = bmrid.getOrganisation();
-                    if (org == null)
-                        org = masterMrid.getOrganisation();
-                    String module = bmrid.getName();
-                    String rev = "latest." + bmd.getStatus();
-
-                    mrid = ModuleRevisionId.newInstance(org, module, rev);
-
-                    dd = new SigilDependencyDescriptor(md, mrid, force, changing,
-                        transitive);
-
-                    Artifact artifact = (Artifact) bundle.getMeta().get(Artifact.class);
-                    if (artifact != null)
-                    {
-                        dd.addDependencyArtifact(mrid.getName(),
-                            new DefaultDependencyArtifactDescriptor(dd,
-                                artifact.getName(), "jar", "jar", null, null));
-                    }
-                }
-                else
-                {
-                    // XXX see FELIX-1395 
-                    // The following code has been commented out as it causes
-                    // problems with require bundle dependencies
-                    // VersionRange version = versions.get( name );
-                    // String rev = version != null ? version.toString() : info.getVersion().toString();
-                    String rev = info.getVersion().toString();
-                    mrid = ModuleRevisionId.newInstance(SigilResolver.ORG_SIGIL, name,
-                        rev);
-                    dd = new SigilDependencyDescriptor(md, mrid, force, changing,
-                        transitive);
-                }
-
-                int nDeps = 0;
-                boolean foundDefault = false;
-
-                // TODO: make dependency configurations configurable SIGIL-176
-                for (String conf : md.getConfigurationsNames())
-                {
-                    if (conf.equals("default"))
-                    {
-                        foundDefault = true;
-                    }
-                    else if (md.getArtifacts(conf).length == 0)
-                    {
-                        dd.addDependencyConfiguration(conf, conf + "(default)");
-                        nDeps++;
-                    }
-                }
-
-                if (nDeps > 0)
-                {
-                    if (foundDefault)
-                        dd.addDependencyConfiguration("default", "default");
-                }
-                else
-                {
-                    dd.addDependencyConfiguration("*", "*"); // all configurations
-                }
-
-                md.addDependency(dd);
-            }
-
-            boolean resolved = true;
-            for (IModelElement child : requirements.children())
-            {
-                ISigilBundle provider = resolution.getProvider(child);
-                if (provider == null)
-                {
-                    resolved = false;
-                    // this is parse phase, so only log verbose message.
-                    // error is produced during resolution phase.
-                    Log.verbose("WARN: can't resolve: " + child);
-
-                    String name;
-                    String version;
-                    if (child instanceof IRequiredBundle)
-                    {
-                        IRequiredBundle rb = (IRequiredBundle) child;
-                        name = rb.getSymbolicName();
-                        version = rb.getVersions().toString();
-                    }
-                    else
-                    {
-                        IPackageImport pi = (IPackageImport) child;
-                        name = "import!" + pi.getPackageName();
-                        version = pi.getVersions().toString();
-                    }
-
-                    mrid = ModuleRevisionId.newInstance("!" + SigilResolver.ORG_SIGIL,
-                        name, version);
-                    dd = new SigilDependencyDescriptor(md, mrid, force, changing,
-                        transitive);
-                    dd.addDependencyConfiguration("*", "*"); // all
-                    // configurations
-                    md.addDependency(dd);
-                }
-            }
-
-            if (!resolved)
-            {
-                // Ivy does not show warnings or errors logged from parse phase, until after resolution.
-                // but <buildlist> ant task doesn't do resolution, so errors would be silently ignored.
-                // Hence, we must use Message.info to ensure this failure is seen.
-                if (!quiet)
-                    Log.info("WARN: resolution failed in: " + masterMrid.getName()
-                        + ". Use -v for details.");
-            }
-        }
-
-        /*
-         * find named resolver, or first resolver that implements IBldResolver.
-         */
-        private IBldResolver findResolver()
-        {
-            if (resolver == null)
-            {
-                Ivy ivy = IvyContext.getContext().peekIvy();
-                if (ivy != null)
-                {
-                    if (resolverName != null)
-                    {
-                        DependencyResolver r = ivy.getSettings().getResolver(resolverName);
-                        if (r == null)
-                        {
-                            throw new Error("SigilParser: resolver \"" + resolverName
-                                + "\" not defined.");
-                        }
-                        else if (r instanceof IBldResolver)
-                        {
-                            resolver = (IBldResolver) r;
-                        }
-                        else
-                        {
-                            throw new Error("SigilParser: resolver \"" + resolverName
-                                + "\" is not a SigilResolver.");
-                        }
-                    }
-                    else
-                    {
-                        for (Object r : ivy.getSettings().getResolvers())
-                        {
-                            if (r instanceof IBldResolver)
-                            {
-                                resolver = (IBldResolver) r;
-                                break;
-                            }
-                        }
-                    }
-
-                    if (resolver == null)
-                    {
-                        throw new Error(
-                            "SigilParser: can't find SigilResolver. Check ivysettings.xml.");
-                    }
-                }
-                else if (config != null)
-                {
-                    Log.warn("creating duplicate resolver to support IvyDE.");
-                    resolver = new SigilResolver();
-                    ((SigilResolver) resolver).setConfig(config);
-                }
-            }
-            return resolver;
-        }
-    }
-
-}
-
-/*
- * this is only needed so that we can distinguish sigil-added dependencies from
- * existing ones.
- */
-class SigilDependencyDescriptor extends DefaultDependencyDescriptor
-{
-    public SigilDependencyDescriptor(DefaultModuleDescriptor md, ModuleRevisionId mrid, boolean force, boolean changing, boolean transitive)
-    {
-        super(md, mrid, force, changing, transitive);
-    }
-}
\ No newline at end of file
diff --git a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/SigilResolver.java b/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/SigilResolver.java
deleted file mode 100644
index a4b4c57..0000000
--- a/sigil/ivy/resolver/src/org/apache/felix/sigil/ivy/SigilResolver.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.ivy;
-
-import static java.lang.String.format;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-import java.util.jar.Manifest;
-
-import org.apache.felix.sigil.common.config.BldFactory;
-import org.apache.felix.sigil.common.config.IRepositoryConfig;
-import org.apache.felix.sigil.common.model.IModelElement;
-import org.apache.felix.sigil.common.model.ModelElementFactory;
-import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
-import org.apache.felix.sigil.common.model.osgi.IBundleModelElement;
-import org.apache.felix.sigil.common.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.common.osgi.VersionRange;
-import org.apache.felix.sigil.common.repository.IResolution;
-import org.apache.felix.sigil.common.repository.ResolutionException;
-import org.apache.ivy.core.module.descriptor.Artifact;
-import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
-import org.apache.ivy.core.module.id.ModuleRevisionId;
-import org.apache.ivy.core.resolve.ResolveData;
-import org.apache.ivy.plugins.repository.Resource;
-import org.apache.ivy.plugins.repository.url.URLResource;
-import org.apache.ivy.plugins.resolver.BasicResolver;
-import org.apache.ivy.plugins.resolver.util.ResolvedResource;
-import org.apache.ivy.util.FileUtil;
-
-/**
- * This resolver is able to work with Sigil repositories.
- * It does not allow publishing.
- */
-public class SigilResolver extends BasicResolver implements IBldResolver
-{
-    /** the sigil-injected dependency organisation name */
-    static final String ORG_SIGIL = "sigil";
-
-    private IBldResolver resolver;
-    private String config;
-    private boolean extractBCP = false;
-    private Map<String, Resource> resourcesCache = new HashMap<String, Resource>();
-
-    /**
-     * no-args constructor required by Ivy.
-     * 
-     * XXX: It doesn't currently seem to matter that Ivy instantiates this many times,
-     * since SigilParser caches it, and the ProjectRepositoryProvider static cache
-     * prevents it being re-loaded unnecessarily.
-     * 
-     * If this should become a problem, then we will need to delegate to a singleton instance,
-     * as we have done in SigilParser.
-     */
-    public SigilResolver()
-    {
-    }
-
-    public void setConfig(String config)
-    {
-        this.config = config;
-    }
-
-    /**
-     * if true, resolver extracts any jars embedded in Bundle-ClassPath.
-     */
-    public void setExtractBCP(String extract)
-    {
-        this.extractBCP = Boolean.parseBoolean(extract);
-    }
-
-    private IBldResolver getResolver()
-    {
-        if (resolver == null)
-        {
-            if (config == null)
-            {
-                throw new Error(
-                    "SigilResolver: not configured. Specify config=\"PATH\" in ivysettings.xml.");
-            }
-            try
-            {
-                URI uri;
-                File file = new File(config);
-
-                if (file.isAbsolute())
-                {
-                    uri = file.toURI();
-                }
-                else
-                {
-                    URI cwd = new File(".").toURI();
-                    uri = cwd.resolve(config);
-                }
-
-                IRepositoryConfig project = BldFactory.getConfig(uri);
-                resolver = new BldResolver(project);
-            }
-            catch (IOException e)
-            {
-                throw new Error("SigilResolver: failed to configure: " + e);
-            }
-        }
-        return resolver;
-    }
-
-    public IResolution resolveOrFail(IModelElement element, boolean transitive)
-        throws ResolutionException
-    {
-        return getResolver().resolveOrFail(element, transitive);
-    }
-
-    public IResolution resolve(IModelElement element, boolean transitive)
-    {
-        return getResolver().resolve(element, transitive);
-    }
-
-    public String getTypeName()
-    {
-        return "sigil";
-    }
-
-    /*
-     * synthesize an ivy descriptor for a Sigil dependency. called after Sigil
-     * resolution, so descriptor already contains resolved version.
-     */
-    public ResolvedResource findIvyFileRef(DependencyDescriptor dd, ResolveData data)
-    {
-        ResolvedResource ref = null;
-
-        ModuleRevisionId id = dd.getDependencyRevisionId();
-
-        if (!id.getOrganisation().equals(ORG_SIGIL))
-        {
-            return null;
-        }
-
-        ISigilBundle bundle = resolve(id);
-        if (bundle == null)
-        {
-            Log.error("Failed to find bundle for module " + id);
-            return null;
-        }
-
-        String symbolicName = id.getName();
-        String version = bundle.getVersion().toString();
-
-        Resource res = new SigilIvy(extractBCP ? bundle : null, symbolicName, version);
-        ref = new ResolvedResource(res, version);
-
-        Log.debug(format("findIvyFileRef: dd=%s => ref=%s", dd, ref));
-        return ref;
-    }
-
-    @Override
-    protected ResolvedResource findArtifactRef(Artifact artifact, Date date)
-    {
-        String name = artifact.getName();
-        ModuleRevisionId id = artifact.getModuleRevisionId();
-
-        if (!id.getOrganisation().equals(ORG_SIGIL))
-        {
-            return null;
-        }
-
-        ISigilBundle bundle = resolve(id);
-        if (bundle == null)
-        {
-            return null;
-        }
-
-        IBundleModelElement info = bundle.getBundleInfo();
-        URI uri = info.getUpdateLocation();
-        Resource res = null;
-
-        try
-        {
-            URL url = (uri != null) ? uri.toURL() : bundle.getLocation().toURI().toURL();
-            if (name.contains("!"))
-            {
-                String[] split = name.split("!");
-                url = new URL("jar:" + url + "!/" + split[1] + "." + artifact.getExt());
-            }
-            res = new URLResource(url);
-        }
-        catch (MalformedURLException e)
-        {
-            System.out.println("Oops! " + e);
-        }
-
-        String version = bundle.getVersion().toString();
-        ResolvedResource ref = new ResolvedResource(res, version);
-
-        Log.debug(format("findArtifactRef: artifact=%s, date=%s => ref=%s", artifact,
-            date, ref));
-        return ref;
-    }
-
-    private ISigilBundle resolve(ModuleRevisionId id)
-    {
-        String revision = id.getRevision();
-        String range = revision;
-
-        if (revision.indexOf(',') < 0)
-        {
-            // SigilParser has already resolved the revision from the import
-            // version range.
-            // We now need to locate the same bundle to get its download URL.
-            // We must use an OSGi version range to specify the exact version,
-            // otherwise it will resolve to "specified version or above".
-            range = "[" + revision + "," + revision + "]";
-        }
-
-        IRequiredBundle bundle = ModelElementFactory.getInstance().newModelElement(
-            IRequiredBundle.class);
-        bundle.setSymbolicName(id.getName());
-        bundle.setVersions(VersionRange.parseVersionRange(range));
-
-        Log.verbose("searching for " + bundle);
-
-        try
-        {
-            IResolution resolution = resolveOrFail(bundle, false);
-            ISigilBundle[] bundles = resolution.getBundles().toArray(new ISigilBundle[0]);
-            if (bundles.length == 1)
-            {
-                return bundles[0];
-            }
-        }
-        catch (ResolutionException e)
-        {
-            Log.warn(e.getMessage());
-            return null;
-        }
-        return null;
-    }
-
-    /*
-     * Implement BasicResolver abstract methods
-     */
-
-    @Override
-    protected long get(Resource res, File dest) throws IOException
-    {
-        FileUtil.copy(res.openStream(), dest, null);
-        long len = res.getContentLength();
-        Log.debug(format("get(%s, %s) = %d", res, dest, len));
-        return len;
-    }
-
-    @Override
-    public Resource getResource(String source) throws IOException
-    {
-        source = encode(source);
-        Resource res = resourcesCache.get(source);
-        if (res == null)
-        {
-            res = new URLResource(new URL(source));
-            resourcesCache.put(source, res);
-        }
-        Log.debug(format("SIGIL: getResource(%s) = %d", source, res));
-        return res;
-    }
-
-    private static String encode(String source)
-    {
-        return source.trim().replaceAll(" ", "%20");
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected Collection findNames(Map tokenValues, String token)
-    {
-        throw new Error("SigilResolver: findNames not supported.");
-    }
-
-    public void publish(Artifact artifact, File src, boolean overwrite)
-        throws IOException
-    {
-        throw new Error("SigilResolver: publish not supported.");
-    }
-
-    public void beginPublishTransaction(ModuleRevisionId module, boolean overwrite)
-        throws IOException
-    {
-        // stop publish attempts being silently ignored.
-        throw new Error("SigilResolver: publish not supported.");
-    }
-
-    /*
-     * Synthesize a virtual ivy file for a Sigil dependency.
-     */
-    static class SigilIvy implements Resource
-    {
-        private StringBuilder content = new StringBuilder();
-        private String name;
-        private boolean exists = true;
-
-        private SigilIvy()
-        {
-        }
-
-        public SigilIvy(ISigilBundle bundle, String module, String rev)
-        {
-            this.name = "sigil!" + module + "#" + rev;
-
-            String org = ORG_SIGIL;
-            // FIXME: make status and pub configurable
-            String status = "release";
-            String pub = "20080912162859";
-
-            content.append("<ivy-module version=\"1.0\">\n");
-
-            content.append(format(
-                "<info organisation=\"%s\" module=\"%s\" revision=\"%s\" status=\"%s\" publication=\"%s\"/>\n",
-                org, module, rev, status, pub));
-
-            String bcp = readBundleClassPath(bundle);
-            if (bcp != null)
-            {
-                content.append("<publications>\n");
-                for (String j : bcp.split(",\\s*"))
-                {
-                    if (j.equals("."))
-                    {
-                        content.append("<artifact/>\n");
-                    }
-                    else if (j.endsWith(".jar") && bundleContains(bundle, j))
-                    {
-                        j = j.substring(0, j.length() - 4);
-                        content.append(format("<artifact name=\"%s!%s\"/>\n", module, j));
-                    }
-                }
-                content.append("</publications>\n");
-            }
-
-            // TODO: add dependencies?
-            // <dependencies>
-            // <dependency org="org.apache" name="log4j" rev="1.2.12"
-            // revConstraint="[1.2,1.3)"/>
-            // </dependencies>
-
-            content.append("</ivy-module>\n");
-        }
-
-        private boolean bundleContains(ISigilBundle bundle, String j)
-        {
-            InputStream is = null;
-            try
-            {
-                URL url = getURL(bundle);
-                is = url.openStream();
-                JarInputStream js = new JarInputStream(is, false);
-                JarEntry entry;
-                while ((entry = js.getNextJarEntry()) != null)
-                {
-                    if (j.equals(entry.getName()))
-                    {
-                        return true;
-                    }
-                }
-            }
-            catch (IOException e)
-            {
-            }
-            finally
-            {
-                if (is != null)
-                {
-                    try
-                    {
-                        is.close();
-                    }
-                    catch (IOException e2)
-                    {
-                    }
-                }
-            }
-            return false;
-        }
-
-        private String readBundleClassPath(ISigilBundle bundle)
-        {
-            if (bundle == null)
-                return null;
-
-            InputStream is = null;
-            try
-            {
-                URL url = getURL(bundle);
-                is = url.openStream();
-                JarInputStream js = new JarInputStream(is, false);
-                Manifest m = js.getManifest();
-                if (m != null)
-                    return (String) m.getMainAttributes().getValue("Bundle-ClassPath");
-            }
-            catch (IOException e)
-            {
-            }
-            finally
-            {
-                if (is != null)
-                {
-                    try
-                    {
-                        is.close();
-                    }
-                    catch (IOException e2)
-                    {
-                    }
-                }
-            }
-
-            return null;
-        }
-
-        private URL getURL(ISigilBundle bundle) throws MalformedURLException
-        {
-            URI uri = bundle.getBundleInfo().getUpdateLocation();
-            if (uri != null)
-            {
-                return uri.toURL();
-            }
-            else
-            {
-                File path = bundle.getLocation();
-                if (path == null)
-                {
-                    throw new NullPointerException("Missing location for "
-                        + bundle.getSymbolicName());
-                }
-                return path.toURI().toURL();
-            }
-        }
-
-        public String toString()
-        {
-            return "SigilIvy[" + name + "]";
-        }
-
-        // clone is used to read checksum files
-        // so clone(getName() + ".sha1").exists() should be false
-        public Resource clone(String cloneName)
-        {
-            Log.debug("SigilIvy: clone: " + cloneName);
-            SigilIvy clone = new SigilIvy();
-            clone.name = cloneName;
-            clone.exists = false;
-            return clone;
-        }
-
-        public boolean exists()
-        {
-            return exists;
-        }
-
-        public long getContentLength()
-        {
-            return content.length();
-        }
-
-        public long getLastModified()
-        {
-            // TODO Auto-generated method stub
-            Log.debug("NOT IMPLEMENTED: getLastModified");
-            return 0;
-        }
-
-        public String getName()
-        {
-            return name;
-        }
-
-        public boolean isLocal()
-        {
-            return false;
-        }
-
-        @SuppressWarnings("deprecation")
-        public InputStream openStream() throws IOException
-        {
-            return new java.io.StringBufferInputStream(content.toString());
-        }
-    }
-}
diff --git a/sigil/ivy/resolver/test/config/proj1/sigil.properties b/sigil/ivy/resolver/test/config/proj1/sigil.properties
deleted file mode 100644
index 424cd8d..0000000
--- a/sigil/ivy/resolver/test/config/proj1/sigil.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-# proj1 sigil.properties
-
-version: 1.2.3.beta1
-
--bundles: main
-
--exports: standalone
-
--imports: \
-  javax.swing, \
-  javax.servlet, \
-  org.apache.commons.logging, \
-  org.apache.commons.lang, \
-  org.apache.log4j, \
-
-ximports: \
-  !org.cauldron.newton.framework, \
-  !org.osgi.*, \
-  org.apache.log4j;version="1.2.3", \
-
--fragment: \
-  com.springsource.org.apache.commons.lang;version="[2.0.0,2.4.0)"
-
--composites: \
-  ivy.xml
-
--resources: \
-  version.properties
-
-header;Bundle-Vendor: Paremus Limited
-header;Random-Heading: this header is a bit like random
-
-# end
diff --git a/sigil/ivy/resolver/test/config/sigil-defaults.properties b/sigil/ivy/resolver/test/config/sigil-defaults.properties
deleted file mode 100644
index 784ef8e..0000000
--- a/sigil/ivy/resolver/test/config/sigil-defaults.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-# sigil defaults
-
-package;javax.servlet:			(2.4,3.0]
-package;org.apache.log4j:		[1.2.14,1.3)
-package;org.apache.commons.lang:	[2.0.0,2.4.0)
-
diff --git a/sigil/ivy/resolver/test/dependence/build.xml b/sigil/ivy/resolver/test/dependence/build.xml
deleted file mode 100644
index acb37e9..0000000
--- a/sigil/ivy/resolver/test/dependence/build.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="dependence" default="clean">
-    
-    <!-- ================================= 
-          target: clean              
-         ================================= -->
-    <target name="clean" description="--> clean directories">
-        <delete includeemptydirs="true"> 
-            <fileset dir="settings" excludes="ivysettings.*, sigil*.properties" />
-		</delete>
-        <ant dir="dependee" antfile="build.xml" target="clean" inheritall="false" inheritrefs="false" />
-        <ant dir="depender" antfile="build.xml" target="clean" inheritall="false" inheritrefs="false" />
-    </target>
-
-    <!-- ================================= 
-          target: all              
-         ================================= -->
-    <target name="all" depends="clean" description="--> make the whole example of dependency">
-        <ant dir="dependee" antfile="build.xml" target="publish" inheritall="false" inheritrefs="false" />
-        <ant dir="depender" antfile="build.xml" inheritall="false" inheritrefs="false" />
-        <ant dir="dependee" antfile="build.xml" target="publish" inheritall="false" inheritrefs="false" />
-        <ant dir="depender" antfile="build.xml" inheritall="false" inheritrefs="false" />
-    </target>
-    
-</project>
diff --git a/sigil/ivy/resolver/test/dependence/dependee/build.xml b/sigil/ivy/resolver/test/dependence/dependee/build.xml
deleted file mode 100644
index f35c2f9..0000000
--- a/sigil/ivy/resolver/test/dependence/dependee/build.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="dependee" default="run" xmlns:ivy="antlib:org.apache.ivy.ant">
-    <!-- some variables used -->
-    <property name="lib.dir" value="${basedir}/lib" />
-    <property name="build.dir" value="${basedir}/build" />
-    <property name="classes.dir" value="${build.dir}/classes" />
-    <property name="src.dir" value="${basedir}/src" />
-
-    <!-- ivy properties used -->
-    <property name="ivy.settings.dir" value="../settings" />
-    <property file="${ivy.settings.dir}/ivysettings.properties" />
-
-    <!-- paths used for compilation and run -->
-    <path id="lib.path.id">
-	<fileset dir="${lib.dir}" />
-    </path>
-    <path id="run.path.id">
-	<path refid="lib.path.id" />
-	<path location="${classes.dir}" />
-    </path>
-    
-    <property name="ivy.jar.file"
-	     value="/opt/apache-ivy-2.0.0/ivy-2.0.0.jar"/>
-
-    <!-- ================================= 
-          target: init
-         ================================= -->
-    <target name="init">
-      <taskdef resource="org/apache/ivy/ant/antlib.xml"
-		    uri="antlib:org.apache.ivy.ant"
-		    classpath="${ivy.jar.file}"/>
-      <ivy:settings file="${ivy.settings.dir}/ivysettings.xml" />
-
-	<taskdef name="sigil.bundle"
-	  classname="org.apache.felix.sigil.ant.BundleTask"
-	  classpath="${basedir}/../../../target/sigil-ivy-plugin.jar"/>
-    </target>
-
-    <!-- ================================= 
-          target: resolve              
-         ================================= -->
-    <target name="resolve" depends="init"
-    	description="--> resolve and retrieve dependencies with ivy">
-        <ivy:retrieve />
-    </target>
-
-    <!-- ================================= 
-          target: report              
-         ================================= -->
-    <target name="report" depends="resolve" description="--> generates a report of dependencies">
-        <ivy:report todir="${build.dir}"/>
-    </target>
-	
-    <!-- ================================= 
-          target: compile              
-         ================================= -->
-    <target name="compile" depends="resolve" description="--> description">
-        <mkdir dir="${classes.dir}" />
-        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="lib.path.id" />
-    </target>
-    
-    <!-- ================================= 
-          target: run
-         ================================= -->
-    <target name="run" depends="compile" description="--> compile and run the project">
-        <java classpathref="run.path.id" classname="standalone.Main"/>
-    </target>
-    
-    <!-- ================================= 
-          target: jar              
-         ================================= -->
-    <target name="jar" depends="compile" description="--> make a jar file for this project">
-        <propertyfile file="${classes.dir}/version.properties">
-	        <entry  key="version" type="int" operation="+" default="0" />
-		</propertyfile>
-        <property file="${classes.dir}/version.properties" />
-
-	<!--
-        <jar destfile="${build.dir}/${ant.project.name}.jar">
-            <fileset dir="${classes.dir}" />
-        </jar>
-	-->
-
-        <sigil.bundle destpattern="${build.dir}/[id].[ext]"
-		classpathref="run.path.id" />
-
-    </target>
-
-    <!-- ================================= 
-          target: publish              
-         ================================= -->
-    <target name="publish" depends="jar" description="--> publish this project in the ivy repository">
-        <property name="revision" value="${version}"/>
-        <delete file="${build.dir}/ivy.xml"/>
-		<ivy:publish artifactspattern="${build.dir}/[artifact].[ext]" 
-			resolver="projects"
-			pubrevision="${revision}" 
-			status="release"
-		/>
-        <echo message="project ${ant.project.name} released with version ${revision}" />
-    </target>
-
-
-    <!-- ================================= 
-          target: clean              
-         ================================= -->
-    <target name="clean" description="--> clean the project">
-        <delete includeemptydirs="true">
-            <fileset dir="${basedir}">
-            	<exclude name="src/**" />
-            	<exclude name="build.xml" />
-		    	<exclude name="ivy.xml" />
-		    	<exclude name="sigil.properties" />
-        	</fileset>
-    	</delete>
-    </target>
-</project>
diff --git a/sigil/ivy/resolver/test/dependence/dependee/ivy.xml b/sigil/ivy/resolver/test/dependence/dependee/ivy.xml
deleted file mode 100644
index b250663..0000000
--- a/sigil/ivy/resolver/test/dependence/dependee/ivy.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info organisation="org.apache" module="dependee"/>
-    <dependencies>
-	<!--
-        <dependency org="sigil" name="com.springsource.org.apache.log4j" rev="[1.2,1.3)"/>
-	-->
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/test/dependence/dependee/sigil.properties b/sigil/ivy/resolver/test/dependence/dependee/sigil.properties
deleted file mode 100644
index 9dd7d8a..0000000
--- a/sigil/ivy/resolver/test/dependence/dependee/sigil.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-# dependee sigil.properties
-# all initial comments are retained.
-
-version: 1.2.3.beta1
-
--bundles: dependee
-
--exports: standalone
-
--imports: \
-  org.apache.commons.lang;version="[2.0.0,2.4.0)";resolve=compile;resolution=optional, \
-  org.apache.commons.logging, \
-  javax.servlet;version="(2.4,3.0]", \
-  org.apache.log4j;version="[1.2.14,1.3)", \
-  javax.swing, \
-
--resources: \
-  version.properties
-
-header;Hello: World
-
-X-requires: \
-  com.springsource.org.apache.commons.lang;version="[2.0.0,2.4.0)", \
-
-# end
diff --git a/sigil/ivy/resolver/test/dependence/dependee/src/standalone/Main.java b/sigil/ivy/resolver/test/dependence/dependee/src/standalone/Main.java
deleted file mode 100644
index 12ffa27..0000000
--- a/sigil/ivy/resolver/test/dependence/dependee/src/standalone/Main.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package standalone;
-
-import java.util.Properties;
-
-import org.apache.commons.lang.WordUtils;
-
-/**
- * TODO write javadoc
- */
-public class Main {
-    /**
-     * Returns the version of the project
-     * @return a string representation of the version, null if the version could not be retreived
-     */
-    public static String getVersion() {
-        Properties p = new Properties();
-        try {
-            p.load(Main.class.getResourceAsStream("/version.properties"));
-            String version = p.getProperty("version");
-            if (version != null) {
-                return String.valueOf(Integer.parseInt(version));
-            } 
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-    
-    /**
-     * Return the same string with all words capitalized.
-     * @param str the string conatining the words to capitalize
-     * @return null if the string was null, the string with all words capitalized otherwise
-     */
-    public static String capitalizeWords(String str) {
-        System.out.println("    [" + Main.class.getName() + "] capitalizing string \"" + str + "\" using " + WordUtils.class.getName());
-        return WordUtils.capitalizeFully(str);
-    }
-    public static void main(String[] args) {
-        String message="sentence to capitalize";
-        System.out.println("standard message : " + message);
-        System.out.println("capitalized message : " + capitalizeWords(message));
-    }
-}
diff --git a/sigil/ivy/resolver/test/dependence/depender/build.xml b/sigil/ivy/resolver/test/dependence/depender/build.xml
deleted file mode 100644
index 01216b7..0000000
--- a/sigil/ivy/resolver/test/dependence/depender/build.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="depender" default="run" xmlns:ivy="antlib:org.apache.ivy.ant">
-    <!-- some variables used -->
-    <property name="lib.dir" value="${basedir}/lib" />
-    <property name="build.dir" value="${basedir}/build" />
-    <property name="classes.dir" value="${build.dir}/classes" />
-    <property name="src.dir" value="${basedir}/src" />
-
-    <!-- ivy properties used -->
-    <property name="ivy.settings.dir" value="../settings" />
-    <property file="${ivy.settings.dir}/ivysettings.properties" />
-    
-    <!-- paths used for compilation and run  -->
-    <path id="lib.path.id">
-        <fileset dir="${lib.dir}" />
-	</path>
-    <path id="run.path.id">
-        <path refid="lib.path.id" />
-        <path location="${classes.dir}" />
-    </path>
-
-    <property name="ivy.jar.file"
-	     value="/opt/apache-ivy-2.0.0/ivy-2.0.0.jar"/>
-
-    <!-- ================================= 
-          target: init
-         ================================= -->
-    <target name="init">
-      <taskdef resource="org/apache/ivy/ant/antlib.xml"
-		    uri="antlib:org.apache.ivy.ant"
-		    classpath="${ivy.jar.file}"/>
-      <ivy:settings file="${ivy.settings.dir}/ivysettings.xml" />
-    </target>
-
-    <!-- ================================= 
-          target: resolve              
-         ================================= -->
-    <target name="resolve" depends="init"
-    	description="--> resolve and retrieve dependencies with ivy">
-        <ivy:retrieve />
-    </target>
-    
-    <!-- ================================= 
-          target: report              
-         ================================= -->
-    <target name="report" depends="resolve" description="--> generates a report of dependencies">
-        <ivy:report todir="${build.dir}" dot="true"/>
-    </target>
-    
-    <!-- ================================= 
-          target: gen-graph
-         ================================= -->
-    <target name="gen-graph" depends="report" description="--> generates a graph of dependencies (requires dot in your path - see http://www.graphviz.org/)">
-    	<property name="dot.file" value="${build.dir}/apache-depending-default.dot" />
-    	<property name="ivygraph.output.file" value="${build.dir}/graph.png" />
-    	<exec executable="dot">
-    	    <arg line="-T png -o ${ivygraph.output.file} ${dot.file}" />
-    	</exec>
-    </target>
-    
-    <!-- ================================= 
-          target: compile              
-         ================================= -->
-    <target name="compile" depends="resolve" description="--> description">
-        <mkdir dir="${classes.dir}" />
-        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="lib.path.id" />
-    </target>
-    
-    <!-- ================================= 
-          target: run
-         ================================= -->
-    <target name="run" depends="clean, compile" description="--> compile and run the project">
-        <java classpathref="run.path.id" classname="depending.Main"/>
-    </target>
-    
-    <!-- ================================= 
-          target: clean              
-         ================================= -->
-    <target name="clean" description="--> clean the project">
-        <delete includeemptydirs="true">
-            <fileset dir="${basedir}">
-            	<exclude name="src/**" />
-            	<exclude name="build.xml" />
-		    	<exclude name="ivy.xml" />
-		    	<exclude name="sigil.properties" />
-        	</fileset>
-    	</delete>
-    </target>
-</project>
diff --git a/sigil/ivy/resolver/test/dependence/depender/ivy.xml b/sigil/ivy/resolver/test/dependence/depender/ivy.xml
deleted file mode 100644
index f825b21..0000000
--- a/sigil/ivy/resolver/test/dependence/depender/ivy.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info organisation="org.apache" module="depender"/>
-    <dependencies>
-	<!--
-        <dependency name="dependee" rev="latest.integration" />
-	-->
-    </dependencies>
-    <conflicts>
-        <manager name="latest-compatible"/>
-    </conflicts>
-</ivy-module>
diff --git a/sigil/ivy/resolver/test/dependence/depender/sigil.properties b/sigil/ivy/resolver/test/dependence/depender/sigil.properties
deleted file mode 100644
index e76ec83..0000000
--- a/sigil/ivy/resolver/test/dependence/depender/sigil.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-# depender sigil.properties
-
--bundles: depender
-
--imports: standalone
-
-# end
diff --git a/sigil/ivy/resolver/test/dependence/depender/src/depending/Main.java b/sigil/ivy/resolver/test/dependence/depender/src/depending/Main.java
deleted file mode 100644
index db1b208..0000000
--- a/sigil/ivy/resolver/test/dependence/depender/src/depending/Main.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package depending;
-
-/**
- * TODO write javadoc
- */
-public class Main {
-    public static void main(String[] args) {
-        String standaloneVersion = standalone.Main.getVersion();
-        if (standaloneVersion!=null) {
-            System.out.println("you are using version " + standaloneVersion + " of class " + standalone.Main.class.getName());
-        } else {
-            System.err.println("failed to get version of " + standalone.Main.class.getName());
-        }
-        String message = "i am " + Main.class.getName() + " and " + standalone.Main.class.getName() + " will do the job for me";
-        System.out.println("standard message : " + message);
-        System.out.println("capitalized message : " + standalone.Main.capitalizeWords(message));
-    }
-}
diff --git a/sigil/ivy/resolver/test/dependence/settings/ivysettings.properties b/sigil/ivy/resolver/test/dependence/settings/ivysettings.properties
deleted file mode 100644
index f68f415..0000000
--- a/sigil/ivy/resolver/test/dependence/settings/ivysettings.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-repository.dir=${ivy.settings.dir}/repository
diff --git a/sigil/ivy/resolver/test/dependence/settings/ivysettings.xml b/sigil/ivy/resolver/test/dependence/settings/ivysettings.xml
deleted file mode 100644
index 2127496..0000000
--- a/sigil/ivy/resolver/test/dependence/settings/ivysettings.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivysettings>
-  <properties file="${ivy.settings.dir}/ivysettings.properties"/>
-  <settings defaultResolver="sigil-libs"/>
-
-  <!--<caches defaultCacheDir="${ivy.settings.dir}/ivy-cache" />
-  -->
-  <caches default="mycache" checkUpToDate="false">
-    <cache name="mycache" basedir="${ivy.settings.dir}/ivy-cache" useOrigin="true"/>
-  </caches>
-
-  <classpath file="${ivy.settings.dir}/../../../target/sigil-ivy-plugin.jar" />
-  <typedef name="sigil-parser" classname="org.apache.felix.sigil.ivy.SigilParser" />
-  <typedef name="sigil" classname="org.apache.felix.sigil.ivy.SigilResolver" />
-
-  <parsers>
-    <sigil-parser/>
-  </parsers>
-
-  <resolvers>
-    <sigil name="sigil-libs" config="${ivy.settings.dir}/sigil-repos.properties" />
-    <filesystem name="projects">
-      <ivy pattern="${repository.dir}/[module]-[revision].xml" />
-      <artifact pattern="${repository.dir}/[artifact]-[revision].[ext]" />
-    </filesystem>
-</resolvers>
-<modules>
-  <module organisation="org.apache" name="dependee" resolver="projects"/>
-</modules>
-</ivysettings>
diff --git a/sigil/ivy/resolver/test/dependence/settings/sigil-repos.properties b/sigil/ivy/resolver/test/dependence/settings/sigil-repos.properties
deleted file mode 100644
index f00cfaf..0000000
--- a/sigil/ivy/resolver/test/dependence/settings/sigil-repos.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# repository config
-
--repositories:	system, project, spring
-
-system;provider:	system
-system;level:		-1
-
-project;provider:	project
-project;level:		0
-project;pattern:	${..}/*/[sigilproject]
-
-spring;provider:	obr
-spring;level:		2
-spring;url:		http://sigil.codecauldron.org/spring-external.obr
-spring;index:		${..}/settings/spring-external.obr
-
-# end
diff --git a/sigil/ivy/resolver/test/dependence/sigil-defaults.properties b/sigil/ivy/resolver/test/dependence/sigil-defaults.properties
deleted file mode 100644
index 2bc4bc9..0000000
--- a/sigil/ivy/resolver/test/dependence/sigil-defaults.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-header;Bundle-Vendor: Paremus Limited
-version: 1.2.3.parent
diff --git a/sigil/ivy/resolver/test/multi-project/build.xml b/sigil/ivy/resolver/test/multi-project/build.xml
deleted file mode 100644
index fd2d774..0000000
--- a/sigil/ivy/resolver/test/multi-project/build.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="all" default="order" xmlns:ivy="antlib:org.apache.ivy.ant">
-  <property name="common.dir" value="${basedir}/common" />
-  <import file="${common.dir}/common.xml"/>
-
-  <fileset id="projects" dir="projects" includes="**/build.xml"/>
-
-  <path id="unordered-list">
-    <fileset refid="projects"/>
-  </path>
-
-  <target name="buildlist" depends="load-ivy"> 
-    <ivy:buildlist reference="ordered-list">
-      <fileset refid="projects"/>
-    </ivy:buildlist>
-  </target>
-  
-  <target name="publish" depends="buildlist" 
-	description="compile, jar and publish all projects in the right order">
-    <subant target="publish" buildpathref="ordered-list">
-      <propertyset>
-	<propertyref name="ivy.loaded" />
-      </propertyset>
-    </subant>
-  </target>
-
-  <target name="clean" description="clean all projects">
-    <subant target="clean" buildpathref="unordered-list" />
-  </target>
-  
-  <target name="fullclean" depends="clean, load-ivy" 
-  description="clean tutorial: delete repository, ivy cache, and all projects">
-    <delete dir="repository"/>
-  	<ivy:cleancache />
-  </target>
-
-  <target name="order" depends="buildlist">
-    <subant target="hello" buildpathref="ordered-list" />
-  </target>
-
-</project>
diff --git a/sigil/ivy/resolver/test/multi-project/common/build.properties b/sigil/ivy/resolver/test/multi-project/common/build.properties
deleted file mode 100644
index 9552b4a..0000000
--- a/sigil/ivy/resolver/test/multi-project/common/build.properties
+++ /dev/null
@@ -1,30 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-lib.dir = ${basedir}/lib
-build.dir = ${basedir}/build
-classes.dir = ${build.dir}/classes
-src.dir = ${basedir}/src
-repository.dir=${common.dir}/../repository
-
-ivy.file = ${basedir}/ivy.xml
-
-jar.file = ${build.dir}/${ant.project.name}.jar
-main.class.name = ${ant.project.name}.Main
-
-module.version.target = 1.0
diff --git a/sigil/ivy/resolver/test/multi-project/common/common.xml b/sigil/ivy/resolver/test/multi-project/common/common.xml
deleted file mode 100644
index 07883a2..0000000
--- a/sigil/ivy/resolver/test/multi-project/common/common.xml
+++ /dev/null
@@ -1,232 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="common" 
-         xmlns:ivy="antlib:org.apache.ivy.ant">
-	<!-- a sample common ant build file, used for ivy multi-project tutorial
-	     feel free to copy and adapt it to your own needs
-	     Note that the only targets specific to ivy are:
-	        load-ivy
-	     	resolve
-	     	report
-	     	ivy-new-version
-	     	publish
-	     	publish-local
-	     	
-	     All other targets are usual ant based targets, which could have been written
-	     in a build not depending at all on ivy: 
-	     resolve constructs a lib directory based upon ivy dependencies, and then the lib dir 
-	     is used as in any classical ant build
-	     -->
-	
-	<property file="${common.dir}/build.properties"/>
-	
-	<property name="ivy.jar.dir" value="/opt/apache-ivy-2.0.0-rc2" />
-	<property name="ivy.jar.file" value="${ivy.jar.dir}/ivy-2.0.0-rc2.jar" />
-        <property name="sigil-ivy-plugin.jar" value="${common.dir}/../../../target/sigil-ivy-plugin.jar"/>
-
-	<target name="hello">
-	    <echo message="${ant.project.name}"/>
-	</target>
-
-	<!-- ================================= 
-          target: load-ivy         
-            this target is not necessary if you put ivy.jar in your ant lib directory
-            if you already have ivy 2.0 in your ant lib, you can simply remove this
-            target
-         ================================= -->
-    <path id="ivy.lib.path">
-	<path location="${ivy.jar.file}"/>
-	<path location="${sigil-ivy-plugin.jar}"/>
-	<!--
-	<path location="${user.home}/src/tmp/ivy/build/ivy.jar"/>
-	-->
-    </path>
-
-    <target name="load-ivy" depends="ivy-taskdefs">
-	<ivy:settings file="${common.dir}/ivysettings.xml" />
-    </target>
-
-    <target name="ivy-taskdefs" unless="ivy.loaded">
-    	<property name="ivy.loaded" value="true"/>
-	<echo message="Loading Ivy ..."/>
-	<!--
-    	<taskdef resource="org/apache/ivy/ant/antlib.xml"
-    	         uri="antlib:org.apache.ivy.ant" classpath="${ivy.jar.file}"/>
-	-->
-    	<taskdef resource="org/apache/ivy/ant/antlib.xml"
-    	         uri="antlib:org.apache.ivy.ant"
-		 loaderRef="ivyLoader"
-		 classpath="${ivy.jar.file}"/>
-
-	<taskdef name="sigil.bundle"
-		 classname="org.apache.felix.sigil.ant.BundleTask"
-		 classpath="${sigil-ivy-plugin.jar}:${bndlib.jar}"/>
-    </target>    
-
-    <path id="lib.path.id">
-        <fileset dir="${lib.dir}" />
-    </path>
-
-    <path id="run.path.id">
-        <path refid="lib.path.id" />
-        <path location="${classes.dir}" />
-    </path>
-
-    
-	<!-- setup ivy default configuration with some custom info -->
-	<property name="ivy.local.default.root" value="${repository.dir}/local"/>
-	<property name="ivy.shared.default.root" value="${repository.dir}/shared"/>
-
-   	<!-- here is how we would have configured ivy if we had our own ivysettings file
-    <ivy:settings file="${common.dir}/ivysettings.xml" />
-    -->
-
-	
-    <!-- ================================= 
-          target: resolve              
-         ================================= -->
-    <target name="resolve" depends="clean-lib, load-ivy" description="--> resolve and retrieve dependencies with ivy">
-        <mkdir dir="${lib.dir}"/> <!-- not usually necessary, ivy creates the directory IF there are dependencies -->
-    	
-    	<!-- the call to resolve is not mandatory, retrieve makes an implicit call if we don't -->
-    	<ivy:resolve file="${ivy.file}"/>
-    	<ivy:retrieve pattern="${lib.dir}/[artifact].[ext]" />
-    </target>
-    
-    <!-- ================================= 
-          target: report              
-         ================================= -->
-    <target name="report" depends="resolve" description="--> generates a report of dependencies">
-        <ivy:report todir="${build.dir}"/>
-    </target>
-    
-    <!-- ================================= 
-          target: compile              
-         ================================= -->
-    <target name="compile" depends="resolve" description="--> compile the project">
-        <mkdir dir="${classes.dir}" />
-        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="lib.path.id" debug="true" />
-    </target>
-    
-    <!-- ================================= 
-          target: run
-         ================================= -->
-    <target name="run" depends="version, compile" description="--> compile and run the project">
-        <java classpathref="run.path.id" classname="${main.class.name}"/>
-    </target>
-
-	<target name="ivy-new-version" depends="load-ivy" unless="ivy.new.revision">
-    	<!-- default module version prefix value -->
-		<property name="module.version.prefix" value="${module.version.target}-dev-b" />
-		
-    	<!-- asks to ivy an available version number -->
-		<ivy:info file="${ivy.file}" />
-    	<ivy:buildnumber 
-    		organisation="${ivy.organisation}" module="${ivy.module}" 
-    		revision="${module.version.prefix}" defaultBuildNumber="1" revSep=""/>
-	</target>
-
-    <target name="local-version">
-		<tstamp>
-			<format property="now" pattern="yyyyMMddHHmmss"/>
-		</tstamp>
-        <property name="ivy.new.revision" value="${module.version.target}-local-${now}"/>
-    </target>
-	
-	<target name="version" depends="ivy-new-version">
-    	<!-- create version file in classpath for later inclusion in jar -->
-        <mkdir dir="${classes.dir}"/>
-		<echo message="version=${ivy.new.revision}" file="${classes.dir}/${ant.project.name}.properties" append="false" />
-
-		<!-- load generated version properties file -->
-        <property file="${classes.dir}/${ant.project.name}.properties" />
-    </target>
-
-    <!-- ================================= 
-          target: jar              
-         ================================= -->
-    <target name="jar" depends="version, compile" description="--> make a jar file for this project">
-
-	<!--
-        <jar destfile="${jar.file}">
-            <fileset dir="${classes.dir}" />
-            <manifest>
-                <attribute name="Built-By" value="${user.name}"/>
-                <attribute name="Build-Version" value="${version}" />
-            </manifest>
-        </jar>
-	-->
-
-        <sigil.bundle destpattern="${build.dir}/[id].[ext]"
-                classpathref="run.path.id"/>
-    </target>
-
-    <!-- ================================= 
-          target: publish              
-         ================================= -->
-    <target name="publish" depends="clean-build, jar" description="--> publish this project in the ivy repository">
-    	<ivy:publish artifactspattern="${build.dir}/[artifact].[ext]" 
-    			           resolver="shared"
-    			           pubrevision="${version}" 
-    			           status="release"
-    	/>
-        <echo message="project ${ant.project.name} released with version ${version}" />
-    </target>
-
-    <!-- ================================= 
-          target: publish-local              
-         ================================= -->
-    <target name="publish-local" depends="local-version, jar" description="--> publish this project in the local ivy repository">
-    	<ivy:publish artifactspattern="${build.dir}/[artifact].[ext]" 
-    			        resolver="local"
-    			        pubrevision="${version}"
-				        pubdate="${now}"
-    			        status="integration"
-    					forcedeliver="true"
-    	/>
-        <echo message="project ${ant.project.name} published locally with version ${version}" />
-    </target>
-
-	<!-- ================================= 
-          target: clean-local              
-         ================================= -->
-	<target name="clean-local" description="--> cleans the local repository for the current module">
-	   <delete dir="${ivy.local.default.root}/${ant.project.name}"/>
-	</target>
-
-	<!-- ================================= 
-          target: clean-lib              
-         ================================= -->
-    <target name="clean-lib" description="--> clean the project libraries directory (dependencies)">
-        <delete includeemptydirs="true" dir="${lib.dir}"/>
-    </target>
-
-    <!-- ================================= 
-          target: clean-build              
-         ================================= -->
-    <target name="clean-build" description="--> clean the project built files">
-        <delete includeemptydirs="true" dir="${build.dir}"/>
-    </target>
-
-    <!-- ================================= 
-          target: clean              
-         ================================= -->
-    <target name="clean" depends="clean-build, clean-lib" description="--> clean the project" />
-</project>
diff --git a/sigil/ivy/resolver/test/multi-project/common/ivysettings.xml b/sigil/ivy/resolver/test/multi-project/common/ivysettings.xml
deleted file mode 100644
index 217bab5..0000000
--- a/sigil/ivy/resolver/test/multi-project/common/ivysettings.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivysettings>
-  <properties file="${ivy.settings.dir}/build.properties"/>
-  <caches defaultCacheDir="${ivy.settings.dir}/../ivy-cache" />
-
-  <settings defaultResolver="shared"
-     circularDependencyStrategy="error" />
-
-  <classpath file="${ivy.settings.dir}/../../../target/sigil-ivy-plugin.jar" />
-  <!--
-  Ant tasks "subant" and "ant" cause IvySettings to be re-loaded, 
-  which then re-loads SigilParser in a new URLClassLoader,
-  which causes ProjectRepository to be re-initialised. Outch!
-
-  Better if Ivy classpath cached its classloader, or provided a
-  loaderRef attribute, like ant does.
-
-  Loading sigil-ivy-plugin.jar in ivy-taskdefs, uses the same ClassLoader
-  to load sigil-ivy-plugin, and thus avoids re-initialising ProjectRepositiory.
-  -->
-  <typedef name="sigil-parser" classname="org.apache.felix.sigil.ivy.SigilParser" />
-  <typedef name="sigil" classname="org.apache.felix.sigil.ivy.SigilResolver" />
-
-  <parsers>
-    <sigil-parser quiet="true"/>
-  </parsers>
-
-  <resolvers>
-    <sigil name="sigil" config="${ivy.settings.dir}/sigil-repos.properties" />
-    <filesystem name="local">
-      <ivy pattern="${repository.dir}/local/[module]-[revision].xml" />
-      <artifact pattern="${repository.dir}/local/[artifact]-[revision].[ext]" />
-    </filesystem>
-    <filesystem name="shared">
-      <ivy pattern="${repository.dir}/shared/[module]-[revision].xml" />
-      <artifact pattern="${repository.dir}/shared/[module]/[artifact]-[revision].[ext]" />
-    </filesystem>
-  </resolvers>
-  <modules>
-    <!--<module organisation="org.apache.ivy.example" name=".*" resolver="shared"/>
-    -->
-    <module organisation="sigil" resolver="sigil"/>
-  </modules>
-</ivysettings>
diff --git a/sigil/ivy/resolver/test/multi-project/common/sigil-gen.sh b/sigil/ivy/resolver/test/multi-project/common/sigil-gen.sh
deleted file mode 100755
index 2f7e184..0000000
--- a/sigil/ivy/resolver/test/multi-project/common/sigil-gen.sh
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/bin/sh
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-# 
-#   http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# sigilgen build.xml ..
-
-function a2s() {
-  find ${1:?} -name '*.java' -o -name '*.spring' -o -name '*.sca' |
-  perl -e '
-    use strict;
-    use FileHandle;
-
-    my %imports;
-    my %exports;
-
-    while (<>) {
-	chomp($_);
-	my $path = $_;
-	my $fh = new FileHandle($path);
-
-	my $testFile = ($path =~ m!Test[^/]+$!);
-
-	while (my $line = <$fh>) {
-	  chomp($line);
-
-	  if ($line =~ /^\s*package\s+([\w.]+)\s*;\s*$/) {
-	    my $exp = $1;
-	    if (!($testFile && ($exp !~ /^test[.]/))) {
-	      $exports{$exp} = 1;
-	    }
-	  } 
-	  elsif ($line =~ /^\s*import\s+([a-z_0-9.]+)([.][A-Z][^.]+)+;\s*$/) {
-	    my $imp = $1;
-	    $imports{$imp} = 1 unless ($imp =~ /^java[.]/);
-	  }
-	  elsif (($line !~ m!^\s*(//|\*|\@)!) &&
-		($line =~ /(\W)((([a-z0-9]{2,})[.]){3,})[A-Z]/)) {
-	    my $quot = $1;
-	    my $imp = $2;
-	    $imp =~ s/.$//;
-
-	    if (($imp !~ /^java[.]/) &&
-	    	($quot ne "\"" || ($path !~ /[.]java$/))) {
-	      $imports{$imp} = 1;
-	    }
-	  }
-	}
-	$fh->close();
-    }
-
-    if (keys(%exports) == () && keys(%imports) == ()) {
-      exit(1);
-    }
-
-    print "-exports: \\\n";
-    foreach my $key (sort keys(%exports)) {
-	print "\t$key, \\\n";
-    }
-    print "\n";
-
-    print "-imports: \\\n";
-    foreach my $key (sort keys(%imports)) {
-	print "\t$key, \\\n";
-    }
-    print "\n";
-
-    exit(0);
-  '
-  return $?
-}
-
-for file in $*; do
-  echo "converting $file"
-  name=$(perl -ne 'print $1 if (/project name="([^"]*)"/);' $file)
-  dir=$(dirname $file)
-
-  if [ -f $dir/sigil.properties ]; then
-    rm -f $dir/sigil.properties.old
-    mv $dir/sigil.properties $dir/sigil.properties.old
-  fi
-
-  (
-    echo "# generated by sigilgen on $(date)"
-    echo
-    echo "-bundles: $name"
-    echo
-    a2s $dir && mv $dir/sigil.properties-part $dir/sigil.properties
-  ) > $dir/sigil.properties-part
-
-  rm -f $dir/sigil.properties-part
-
-done
diff --git a/sigil/ivy/resolver/test/multi-project/common/sigil-repos.properties b/sigil/ivy/resolver/test/multi-project/common/sigil-repos.properties
deleted file mode 100644
index d98b618..0000000
--- a/sigil/ivy/resolver/test/multi-project/common/sigil-repos.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-
-# repository config
-
--repositories:	system, project, newton, spring
-
-system;provider:	system
-system;level:		-1
-#system;framework:	osgi.core.jar
-#system;profile:	J2SE-1.5
-
-project;provider:	project
-project;level:	0
-project;pattern:	../projects/**/[sigilproject]
-
-newton;provider:	filesystem
-newton;level:		1
-newton;recurse:		true
-#newton;dir:		/opt/newton-1.2.5/lib
-newton;dir:		/Users/derek/devl/Newton/src/target/newton-dist.dir/lib
-
-spring;provider:	obr
-spring;level:		2
-spring;url:		http://sigil.codecauldron.org/spring-external.obr
-spring;index:		../settings/spring-external.obr
-
-# end
diff --git a/sigil/ivy/resolver/test/multi-project/projects/console/build.properties b/sigil/ivy/resolver/test/multi-project/projects/console/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/console/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/test/multi-project/projects/console/build.xml b/sigil/ivy/resolver/test/multi-project/projects/console/build.xml
deleted file mode 100644
index 5c02cba..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/console/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="console" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/console/ivy.xml b/sigil/ivy/resolver/test/multi-project/projects/console/ivy.xml
deleted file mode 100644
index 93b5ee5..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/console/ivy.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="console"
-        status="integration"/>
-    <dependencies>
-      <!--
-      <dependency name="version" rev="latest.integration" conf="default" />
-      <dependency name="list" rev="latest.integration" conf="default->standalone" />
-      <dependency name="find" rev="latest.integration" conf="default->standalone" />
-      <dependency name="sizewhere" rev="latest.integration" conf="default->standalone" />
-      -->
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/console/sigil.properties b/sigil/ivy/resolver/test/multi-project/projects/console/sigil.properties
deleted file mode 100644
index 1d4bb13..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/console/sigil.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-
--bundles: console
-
--exports: console
-
--requires: org.example.list
diff --git a/sigil/ivy/resolver/test/multi-project/projects/console/src/console/Main.java b/sigil/ivy/resolver/test/multi-project/projects/console/src/console/Main.java
deleted file mode 100644
index 678f3ca..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/console/src/console/Main.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package console;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.util.Collection;
-import java.util.Arrays;
-import java.lang.reflect.Method;
-
-
-public class Main {
-    private static Collection QUIT_COMMANDS = Arrays.asList(new String[] {"quit", "q", "exit"});
-    private static Collection HELP_COMMANDS = Arrays.asList(new String[] {"help", "h", "?"});
-
-    public static void main(String[] a) throws Exception {
-      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
-      while (true) {
-        System.out.print("> ");
-        String command = in.readLine().trim();
-        if (QUIT_COMMANDS.contains(command)) {
-          return;
-        }
-        if (HELP_COMMANDS.contains(command)) {
-          help();
-          continue;
-        }
-        String[] split = command.split(" ");
-        if (split.length == 0) {
-          error(command);
-          continue;
-        }
-        
-        try {
-          String[] args = new String[split.length - 1];
-          System.arraycopy(split, 1, args, 0, args.length);
-          Class cl = Class.forName(split[0]+".Main");
-          Method m = cl.getMethod("main", new Class[] {String[].class});
-          m.invoke(null, new Object[] {args});
-        } catch (Exception ex) {
-          error(command);
-          continue;
-        }
-      }
-    }
-    
-    private static void help() {
-      System.out.println("available commands:");
-      System.out.println("\tquit: quit the console");
-      System.out.println("\thelp: displays this message");
-      System.out.println("\tlist -dir <dir>: list files in given directory");
-      System.out.println("\tfind -dir <dir> -name <name>: list files with given name in given dir");
-      System.out.println("\tsizewhere -dir <dir> -name <name>: compute total size of files with given name in given dir");
-      System.out.println("\thelp: displays this message");
-    }
-            
-    private static void error(String command) {
-      System.out.println("unknown command "+command);
-      System.out.println("type ? for help");
-    }
-            
-}
diff --git a/sigil/ivy/resolver/test/multi-project/projects/find/build.properties b/sigil/ivy/resolver/test/multi-project/projects/find/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/find/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/test/multi-project/projects/find/build.xml b/sigil/ivy/resolver/test/multi-project/projects/find/build.xml
deleted file mode 100644
index 4d23bf5..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/find/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="find" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/find/ivy.xml b/sigil/ivy/resolver/test/multi-project/projects/find/ivy.xml
deleted file mode 100644
index 8026113..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/find/ivy.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="find"
-        status="integration"/>
-    <configurations>
-      <conf name="core"/>
-      <conf name="standalone" extends="core"/>
-    </configurations>
-    <publications>
-      <artifact name="find" type="jar" conf="core" />
-    </publications>
-    <dependencies>
-      <!--
-      <dependency name="version" rev="latest.integration" conf="core->default" />
-      <dependency name="list" rev="latest.integration" conf="core" />
-      <dependency org="commons-collections" name="commons-collections" rev="3.1" conf="core->default" />
-      <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="standalone->default" />
-      -->
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/find/sigil.properties b/sigil/ivy/resolver/test/multi-project/projects/find/sigil.properties
deleted file mode 100644
index 30c10a7..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/find/sigil.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-
--bundles: find
-
--exports: find
-
--imports:\
-  version, \
-  list, \
-  org.apache.commons.collections, \
-  org.apache.commons.cli
diff --git a/sigil/ivy/resolver/test/multi-project/projects/find/src/find/FindFile.java b/sigil/ivy/resolver/test/multi-project/projects/find/src/find/FindFile.java
deleted file mode 100644
index 25fa1af..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/find/src/find/FindFile.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package find;
-
-import version.Version;
-import list.ListFile;
-
-import java.util.Collection;
-import java.util.ArrayList;
-import java.io.File;
-
-import  org.apache.commons.collections.CollectionUtils;
-import  org.apache.commons.collections.Predicate;
-
-public class FindFile {
-  static {
-    Version.register("find");
-  }
-  
-  public static Collection find(File dir, String name) {
-    return find(ListFile.list(dir), name);
-  }
-  
-  private static Collection find(Collection files, final String name) {    
-    return CollectionUtils.select(files, new Predicate() {
-      public boolean evaluate(Object o) {
-        return ((File)o).getName().indexOf(name) != -1;
-      }
-    });
-  }
-}
diff --git a/sigil/ivy/resolver/test/multi-project/projects/find/src/find/Main.java b/sigil/ivy/resolver/test/multi-project/projects/find/src/find/Main.java
deleted file mode 100644
index a41c136..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/find/src/find/Main.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package find;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.OptionBuilder;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-
-public class Main {
-    private static Options getOptions() {
-        Option dir = OptionBuilder.withArgName("dir")
-            .hasArg()
-            .withDescription("list files in given dir")
-            .create("dir");
-        Option name = OptionBuilder.withArgName("name")
-            .hasArg()
-            .withDescription("list files with given name")
-            .create("name");
-        Options options = new Options();
-
-        options.addOption(dir);
-        options.addOption(name);
-        
-        return options;
-    }
-    
-    public static void main(String[] args) throws Exception {
-        Options options = getOptions();
-        try {
-        
-            CommandLineParser parser = new GnuParser();
-    
-            CommandLine line = parser.parse(options, args);
-            File dir = new File(line.getOptionValue("dir", "."));
-            String name = line.getOptionValue("name", "jar");
-            Collection files = FindFile.find(dir, name);
-            System.out.println("listing files in " + dir + " containing " + name);
-            for (Iterator it = files.iterator(); it.hasNext();) {
-                System.out.println("\t" + it.next() + "\n");
-            }
-        } catch(ParseException exp) {
-            // oops, something went wrong
-            System.err.println("Parsing failed.  Reason: " + exp.getMessage());
-              
-            HelpFormatter formatter = new HelpFormatter();
-            formatter.printHelp("find", options);
-        }        
-    }
-            
-}
diff --git a/sigil/ivy/resolver/test/multi-project/projects/list/build.properties b/sigil/ivy/resolver/test/multi-project/projects/list/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/list/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/test/multi-project/projects/list/build.xml b/sigil/ivy/resolver/test/multi-project/projects/list/build.xml
deleted file mode 100644
index 3926148..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/list/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="list" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/list/ivy.xml b/sigil/ivy/resolver/test/multi-project/projects/list/ivy.xml
deleted file mode 100644
index 7fca587..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/list/ivy.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="list"
-        status="integration"/>
-    <configurations>
-      <conf name="core"/>
-      <conf name="standalone" extends="core"/>
-    </configurations>
-    <publications>
-      <artifact name="list" type="jar" conf="core" />
-    </publications>
-    <dependencies>
-      <!--
-      <dependency name="version" rev="latest.integration" conf="core->default" />
-      <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="standalone->default" />
-      -->
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/list/sigil.properties b/sigil/ivy/resolver/test/multi-project/projects/list/sigil.properties
deleted file mode 100644
index 302cba7..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/list/sigil.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-
-# requirements
-
--imports:\
-  version, \
-  org.apache.commons.cli
-
-# exports
-
--bundles: list
-
-list;name: org.example.list
-list;-exports: list.*
-
diff --git a/sigil/ivy/resolver/test/multi-project/projects/list/src/list/ListFile.java b/sigil/ivy/resolver/test/multi-project/projects/list/src/list/ListFile.java
deleted file mode 100644
index 7467152..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/list/src/list/ListFile.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package list;
-
-import version.Version;
-import java.util.Collection;
-import java.util.ArrayList;
-import java.io.File;
-
-public class ListFile {
-  static {
-    Version.register("list");
-  }
-  
-  public static Collection list(File dir) {
-    Collection files = new ArrayList();
-    
-    return list(dir, files);
-  }
-  
-  private static Collection list(File file, Collection files) {
-    if (file.isDirectory()) {
-      File[] f = file.listFiles();
-      for (int i=0; i<f.length; i++) {
-        list(f[i], files);
-      }
-    } else {
-      files.add(file);
-    }
-    return files;
-  }
-}
diff --git a/sigil/ivy/resolver/test/multi-project/projects/list/src/list/Main.java b/sigil/ivy/resolver/test/multi-project/projects/list/src/list/Main.java
deleted file mode 100644
index 0f8cb14..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/list/src/list/Main.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package list;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.OptionBuilder;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-
-public class Main {
-    private static Options getOptions() {
-        Option dir = OptionBuilder.withArgName( "dir" )
-            .hasArg()
-            .withDescription(  "list files in given dir" )
-            .create( "dir" );
-        Options options = new Options();
-
-        options.addOption(dir);
-        
-        return options;
-    }
-    
-    public static void main(String[] args) throws Exception {
-      Options options = getOptions();
-      try {
-        
-        CommandLineParser parser = new GnuParser();
-
-        CommandLine line = parser.parse( options, args );
-        File dir = new File(line.getOptionValue("dir", "."));
-        Collection files = ListFile.list(dir);
-        System.out.println("listing files in "+dir);
-        for (Iterator it = files.iterator(); it.hasNext(); ) {
-          System.out.println("\t"+it.next()+"\n");
-        }
-      } catch( ParseException exp ) {
-          // oops, something went wrong
-          System.err.println( "Parsing failed.  Reason: " + exp.getMessage() );
-          
-        HelpFormatter formatter = new HelpFormatter();
-        formatter.printHelp( "list", options );
-      }        
-    }
-            
-}
diff --git a/sigil/ivy/resolver/test/multi-project/projects/sigil-defaults.properties b/sigil/ivy/resolver/test/multi-project/projects/sigil-defaults.properties
deleted file mode 100644
index 0000617..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/sigil-defaults.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-
-header;Bundle-Vendor: Paremus Limited
-
-package;org.osgi.framework: 1.7.1
-
-bad-key: wibble
diff --git a/sigil/ivy/resolver/test/multi-project/projects/size/build.properties b/sigil/ivy/resolver/test/multi-project/projects/size/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/size/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/test/multi-project/projects/size/build.xml b/sigil/ivy/resolver/test/multi-project/projects/size/build.xml
deleted file mode 100644
index 2a75fe5..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/size/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="size" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/size/ivy.xml b/sigil/ivy/resolver/test/multi-project/projects/size/ivy.xml
deleted file mode 100644
index 33e9995..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/size/ivy.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="size"
-        status="integration"/>
-    <dependencies>
-      <!--
-      <dependency name="version" rev="latest.integration" conf="default" />
-      <dependency name="list" rev="latest.integration" conf="default->core" />
-      -->
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/size/sigil.properties b/sigil/ivy/resolver/test/multi-project/projects/size/sigil.properties
deleted file mode 100644
index cf239af..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/size/sigil.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-
--bundles: size
-
--exports: size
-
--imports:\
-  list, \
-  version
diff --git a/sigil/ivy/resolver/test/multi-project/projects/size/src/size/FileSize.java b/sigil/ivy/resolver/test/multi-project/projects/size/src/size/FileSize.java
deleted file mode 100644
index dcd4a1c..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/size/src/size/FileSize.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package size;
-
-import version.Version;
-import java.util.Collection;
-import java.util.Iterator;
-import java.io.File;
-
-public class FileSize {
-  static {
-    Version.register("size");
-  }
-
-  public static long totalSize(File dir) {
-    return totalSize(list.ListFile.list(dir));
-  }
-  
-  public static long totalSize(Collection files) {
-    long total = 0;
-    for (Iterator it = files.iterator(); it.hasNext(); ) {
-      File f = (File)it.next();
-      total += f.length();
-    }
-    return total;
-  }  
-}
diff --git a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/build.properties b/sigil/ivy/resolver/test/multi-project/projects/sizewhere/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/build.xml b/sigil/ivy/resolver/test/multi-project/projects/sizewhere/build.xml
deleted file mode 100644
index 0b8ab4c..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="sizewhere" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/ivy.xml b/sigil/ivy/resolver/test/multi-project/projects/sizewhere/ivy.xml
deleted file mode 100644
index 6b86af0..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/ivy.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="sizewhere"
-        status="integration"/>
-    <configurations>
-      <conf name="core"/>
-      <conf name="standalone" extends="core"/>
-    </configurations>
-    <publications>
-      <artifact name="sizewhere" type="jar" conf="core" />
-    </publications>
-    <dependencies>
-      <!--
-      <dependency name="version" rev="latest.integration" conf="core->default" />
-      <dependency name="size" rev="latest.integration" conf="core->default" />
-      <dependency name="find" rev="latest.integration" conf="core" />
-      <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="standalone->default" />
-      -->
-    </dependencies>
-</ivy-module>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/sigil.properties b/sigil/ivy/resolver/test/multi-project/projects/sizewhere/sigil.properties
deleted file mode 100644
index c272f9b..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/sigil.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-
--bundles: sizewhere
-
--exports: sizewhere
-
--imports:\
-  find, \
-  size, \
-  version, \
-  org.apache.commons.cli
diff --git a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/src/sizewhere/Main.java b/sigil/ivy/resolver/test/multi-project/projects/sizewhere/src/sizewhere/Main.java
deleted file mode 100644
index 131af66..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/src/sizewhere/Main.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package sizewhere;
-
-import java.io.File;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.OptionBuilder;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-
-public class Main {
-    private static Options getOptions() {
-        Option dir = OptionBuilder.withArgName( "dir" )
-            .hasArg()
-            .withDescription(  "give total size of files in given dir" )
-            .create( "dir" );
-        Option name = OptionBuilder.withArgName( "name" )
-            .hasArg()
-            .withDescription(  "give total size of files with given name" )
-            .create( "name" );
-        Options options = new Options();
-
-        options.addOption(dir);
-        options.addOption(name);
-        
-        return options;
-    }
-    
-    public static void main(String[] args) throws Exception {
-      Options options = getOptions();
-      try {
-        
-        CommandLineParser parser = new GnuParser();
-
-        CommandLine line = parser.parse( options, args );
-        File dir = new File(line.getOptionValue("dir", "."));
-        String name = line.getOptionValue("name", "jar");
-        System.out.println("total size of files in "+dir+" containing "+name+": "+SizeWhere.totalSize(dir, name));
-      } catch( ParseException exp ) {
-          // oops, something went wrong
-          System.err.println( "Parsing failed.  Reason: " + exp.getMessage() );
-          
-        HelpFormatter formatter = new HelpFormatter();
-        formatter.printHelp( "sizewhere", options );
-      }        
-    }
-            
-}
diff --git a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/src/sizewhere/SizeWhere.java b/sigil/ivy/resolver/test/multi-project/projects/sizewhere/src/sizewhere/SizeWhere.java
deleted file mode 100644
index 3594bd9..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/sizewhere/src/sizewhere/SizeWhere.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package sizewhere;
-
-import version.Version;
-import size.FileSize;
-import find.FindFile;
-
-import java.util.Collection;
-import java.util.ArrayList;
-import java.io.File;
-
-public class SizeWhere {
-  static {
-    Version.register("sizewhere");
-  }
-  
-  public static long totalSize(File dir, String name) {
-    return FileSize.totalSize(FindFile.find(dir, name));
-  }
-}
diff --git a/sigil/ivy/resolver/test/multi-project/projects/version/build.properties b/sigil/ivy/resolver/test/multi-project/projects/version/build.properties
deleted file mode 100644
index 1b54925..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/version/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#	 ***************************************************************
-#	 * Licensed to the Apache Software Foundation (ASF) under one
-#	 * or more contributor license agreements.  See the NOTICE file
-#	 * distributed with this work for additional information
-#	 * regarding copyright ownership.  The ASF licenses this file
-#	 * to you under the Apache License, Version 2.0 (the
-#	 * "License"); you may not use this file except in compliance
-#	 * with the License.  You may obtain a copy of the License at
-#	 * 
-#	 *   http://www.apache.org/licenses/LICENSE-2.0
-#	 * 
-#	 * Unless required by applicable law or agreed to in writing,
-#	 * software distributed under the License is distributed on an
-#	 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#	 * KIND, either express or implied.  See the License for the
-#	 * specific language governing permissions and limitations
-#	 * under the License.
-#	 ***************************************************************
-projects.dir = ${basedir}/..
-wkspace.dir = ${projects.dir}/..
-common.dir = ${wkspace.dir}/common
diff --git a/sigil/ivy/resolver/test/multi-project/projects/version/build.xml b/sigil/ivy/resolver/test/multi-project/projects/version/build.xml
deleted file mode 100644
index 375db20..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/version/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0">
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project name="version" default="compile">
-	<property file="build.properties"/>
-	
-	<import file="${common.dir}/common.xml"/>
-</project>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/version/ivy.xml b/sigil/ivy/resolver/test/multi-project/projects/version/ivy.xml
deleted file mode 100644
index 16e08f3..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/version/ivy.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<ivy-module version="1.0">
-    <info 
-        organisation="org.apache.ivy.example"
-        module="version"
-        status="integration"/>
-</ivy-module>
diff --git a/sigil/ivy/resolver/test/multi-project/projects/version/sigil.properties b/sigil/ivy/resolver/test/multi-project/projects/version/sigil.properties
deleted file mode 100644
index a940ffd..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/version/sigil.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-
--bundles: version
-
--exports: version
diff --git a/sigil/ivy/resolver/test/multi-project/projects/version/src/version/Version.java b/sigil/ivy/resolver/test/multi-project/projects/version/src/version/Version.java
deleted file mode 100644
index 0c69bc5..0000000
--- a/sigil/ivy/resolver/test/multi-project/projects/version/src/version/Version.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package version;
-
-import java.io.InputStream;
-import java.util.Properties;
-import java.util.Map;
-import java.util.HashMap;
-
-public class Version {
-    static {
-        versions = new HashMap();
-        register("version");
-    }
-  
-    private static Map versions;
-  
-    public static void register(String module) {
-        try {
-            InputStream moduleVersion = Version.class.getResourceAsStream("/"+module+".properties");
-            Properties props = new Properties();
-            props.load(moduleVersion);
-            String version = (String)props.get("version");
-            versions.put(module, version);
-            System.out.println("--- using "+module+" v"+version);
-        } catch (Exception ex) {
-            System.err.println("an error occured while registering "+module+": "+ex.getMessage());
-            ex.printStackTrace();
-        }
-    }
-}
diff --git a/sigil/ivy/sigil-defaults.properties b/sigil/ivy/sigil-defaults.properties
deleted file mode 100644
index bfc9d0d..0000000
--- a/sigil/ivy/sigil-defaults.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-# sigil common default properties
--defaults: ${BLDCOMMON:-../bldcommon}/sigil-defaults.properties
diff --git a/sigil/misc/do_notice b/sigil/misc/do_notice
deleted file mode 100644
index 933e145..0000000
--- a/sigil/misc/do_notice
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-# 
-#   http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-here=$(dirname $0)
-
-find . \
-    ! \( -type d \( -name .svn -o -name build \) -prune \) \
-    ! -name '*.jar'  ! -name .classpath ! -name .project \
-    ! -name '*.gif'  ! -name '*.ico' ! -name '*.png' \
-    ! -name '*.config' ! -name '*.policy' \
-    ! -name '*.swp' ! -name '*.txt' ! -name '*.properties' \
-    -type f |
-xargs $here/notice.pl $*
-
diff --git a/sigil/misc/notice.pl b/sigil/misc/notice.pl
deleted file mode 100755
index 64b40e9..0000000
--- a/sigil/misc/notice.pl
+++ /dev/null
@@ -1,295 +0,0 @@
-#!/usr/bin/env perl
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-# 
-#   http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-use FileHandle;
-
-my $dryrun = 0;
-my $quiet = 0;
-
-#
-# Usage: notice.pl [-n] [-q] files...
-#
-
-my $NOTICE = <<'EOT';
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-EOT
-
-# Note: source code notices must not be changed by code formatter
-
-my $NOTICE_java = $NOTICE;
-$NOTICE_java =~ s/^/ * /gm;
-$NOTICE_java = "/*\n" . $NOTICE_java . " */\n\n";
-
-my $NOTICE_xml = $NOTICE;
-$NOTICE_xml =~ s/^/  /gm;
-$NOTICE_xml = "<!--\n" . $NOTICE_xml . "-->\n";
-
-my $NOTICE_sh = $NOTICE;
-$NOTICE_sh =~ s/^/# /gm;
-
-my $NOTICE_bat = $NOTICE;
-$NOTICE_bat =~ s/^/:: /gm;
-
-sub addNotice {
-    my ($fh, $file, $notice) = @_;
-    print "$file\n";
-
-    return if ($dryrun);
-
-    my $tmp = "$file.tmp";
-    my $fh2 = new FileHandle(">$tmp");
-
-    print $fh2 $notice;
-    while (<$fh>) {
-	print $fh2 $_;
-    }
-
-    unlink($file);
-    rename($tmp, $file);
-}
-
-#
-# locate existing copyright & license
-#	starts at top of file
-#	ends at "package" statement
-#
-sub notice_java {
-    my $file = shift;
-    my $fh = new FileHandle($file);
-    my $header;
-    my $package = undef;
-
-    while (<$fh>) {
-        if (/^package\s+[\w.]+\s*;/) {
-	    $package = $_;
-	    last;
-	}
-	last if ($. > 200);
-	$header .= $_;
-    }
-
-    if (! $package) {
-        print STDERR "$file: ERROR: no package statement.\n";
-	return;
-    }
-
-    return if ($header eq $NOTICE_java);
-
-    # completely replace all before package statement
-    # so DON'T change below, without changing above
-    # to stop at end-of-first-comment.
-    $header = '';
-    #$header = '' if ($header =~ /copyright/im);
-    #$header = "\n" . $header unless ($header =~ /^\n/);
-
-    addNotice($fh, $file, $NOTICE_java . $header . $package);
-}
-
-sub notice_xml {
-    my $file = shift;
-    my $fh = new FileHandle($file);
-    my $header = undef;
-    my $decl = qq(<?xml version="1.0"?>\n);
-    my $end = 0;
-    my $start = 0;
-
-    while (<$fh>) {
-    	if ($. == 1 && /^\<\?/) {
-	    $decl = $_;
-	    next;
-	}
-
-	$header .= $_;
-
-    	if (!$start) {
-	  last unless (/^<!--/);
-	  $start = 1;
-	}
-
-        if (/-->/) {
-	    $end = 1;
-	    last;
-	}
-    }
-
-    return if ($header eq $NOTICE_xml);
-
-    $header = '' if ($header =~ /copyright/im);
-
-    if ($start && !$end) {
-        print STDERR "$file: ERROR: initial comment not terminated.\n";
-	return;
-    }
-
-    addNotice($fh, $file, $decl . $NOTICE_xml . $header);
-}
-
-sub notice_sh {
-    my $file = shift;
-    my $fh = new FileHandle($file);
-    my $header = undef;
-    my $hashbang = undef;
-    my $end = '';
-    my $start = '';
-
-    while (<$fh>) {
-    	if ($. == 1 && /^#!/) {
-	    $hashbang = $_;
-	    next;
-	}
-
-    	if (!$start) {
-	  unless (/^(#|\s*$)/) {
-	    $header = $_;
-	    last;
-	  }
-	  $start = 1;
-	  next if (/^\s*$/);
-	}
-
-        if (!/^#/) {
-	    $end = $_;
-	    last;
-	}
-
-	$header .= $_;
-    }
-
-    return if ($header eq $NOTICE_sh);
-
-    $hashbang .= "\n" if ($hashbang);
-
-    $header = '' if ($header =~ /copyright/im);
-    $header .= $end;
-    $header = "\n" . $header unless ($header =~ /^\n/);
-
-    if ($start && !$end) {
-        print STDERR "$file: ERROR: initial comment not terminated.\n";
-	return;
-    }
-
-    addNotice($fh, $file, $hashbang . $NOTICE_sh . $header);
-}
-
-sub notice_bat {
-    my $file = shift;
-    my $fh = new FileHandle($file);
-    my $header = undef;
-    my $atecho = undef;
-    my $end = '';
-    my $start = '';
-
-    while (<$fh>) {
-	s/\r\n$/\n/;
-    	if ($. == 1 && /^\@echo/) {
-	    $atecho = $_;
-	    next;
-	}
-
-    	if (!$start) {
-	  unless (/^(::|\s*$)/) {
-	    $header = $_;
-	    last;
-	  }
-	  $start = 1;
-	  next if (/^\s*$/);
-	}
-
-        if (!/^::/) {
-	    $end = $_;
-	    last;
-	}
-
-	$header .= $_;
-    }
-
-    return if ($header eq $NOTICE_bat);
-
-    $atecho .= "\n" if ($atecho);
-
-    $header = '' if ($header =~ /copyright/im);
-    $header .= $end;
-    $header = "\n" . $header unless ($header =~ /^\n/);
-
-    if ($start && !$end) {
-        print STDERR "$file: ERROR: initial comment not terminated.\n";
-	return;
-    }
-
-    $header = $atecho . $NOTICE_bat . $header;
-    $header =~ s/\n/\r\n/mg;
-    addNotice($fh, $file, $header);
-}
-
-sub notice_unknown {
-    my $file = shift;
-    my $fh = new FileHandle($file);
-
-    my $line = <$fh>;
-
-    if ($line =~ /^#!/) {
-        notice_sh($file);
-    }
-    elsif ($line =~ /^\<\?xml/) {
-        notice_xml($file);
-    }
-    elsif (! $quiet) {
-	print STDERR "$file: unknown file type.\n";
-    }
-}
-
-foreach my $f (@ARGV) {
-    if ($f eq '-n') {
-	$dryrun++;
-    }
-    elsif ($f eq '-q') {
-	$quiet++;
-    }
-    elsif ($f =~ /\.java$/) {
-	notice_java($f);
-    }
-    elsif ($f =~ /\.(xml|xsd|system|composite)$/) {
-	notice_xml($f);
-    }
-    elsif ($f =~ /\.(sh|app|ini|xargs)$/) {
-	notice_sh($f);
-    }
-    elsif ($f =~ /\.(bat)$/) {
-	notice_bat($f);
-    }
-    else {
-	notice_unknown($f);
-    }
-}
-
